2017-04-21 2 views
0

J'ai une application Android qui utilise des bibliothèques c et est compilé pour les architectures x86, armeabi et armeabi-v7a.Architectures de puces mobiles Android différents dans différents pays?

Je l'ai remarqué récemment, il semble que fonctionnera dans un pays de certains téléphones, il semble toutefois, les utilisateurs d'applications en Allemagne, en Corée, en Italie et en Australie ont des UnsatisfiedLinkErrors, en particulier lors de l'utilisation OpenCV ..

I » avons inclus l'utilisation de OpenCV par

static { 

    System.loadLibrary("somecompiledlibname"); 

} 

Exception java.lang.UnsatisfiedLinkError: la méthode native non trouvée: org.opencv.core.Mat.n_Mat :()

Mes questions sont les suivantes:

1) Les architectures sont-elles différentes selon les pays?

2) Comment puis-je contourner ce problème?

+1

En lisant [this] (http://docs.opencv.org/java/2.4.2/org/opencv/core/Mat.html), il n'y a rien qui révèle des architectures dans différents pays, plutôt plus de probablement, le runtime manque une bibliothèque - * UnsatisfiedLinkErrors * est le problème ici, est-ce que vous empaquetez la bibliothèque avec l'application? Vous devrez peut-être creuser plus profondément, découvrir quels modèles ils sont, et les rechercher, découvrez quelle est la version Android de base qui va avec. Pourrait aussi être, la ROM ne peut pas avoir les bibliothèques natives compilées avec des points flottants durs .... – t0mm13b

+0

Chargez-vous implicitement les bibliothèques natives OpenCV? Cela ne fonctionnera pas pour l'API Android ci-dessous 19 (voir https://issuetracker.google.com/issues/36950617). –

Répondre

1

n ° Architectures diffèrent entre les téléphones. Une CPU donnée utilise la même architecture partout dans le monde. x86 serait un processeur PC Intel (ou AMD), parfois utilisé pour les tablettes mais assez rarement. ARM est un type de puce complètement différent, et utilisé par presque tous les appareils mobiles dans le monde. ARMv7 est une version plus moderne d'ARM, mais ne fonctionnera pas pour les processeurs plus anciens. Vous êtes mieux de les soutenir tous, même si presque tout sera vraiment ARMv7 ces jours-ci.

+0

Marquer cela comme la réponse car il répond systématiquement aux questions – Arjun

0

Vous pouvez appeler n'importe quels objets et fonctions OpenCV, y compris les constructeurs d'objets, uniquement après l'initialisation d'OpenCV. Lorsque OpenCV est initialisé correctement, onManagerConnected (LoaderCallbackInterface.SUCCESS) est appelé.

Essayez la même chose que ici:

static { 
    if (!OpenCVLoader.initDebug()) { 
     //.. 
    } 
}