Android UnsatisfiedLinkError avec OpenCV 2.4.2
juste essayer de faire un simple openCV android programme. Téléchargé et installé OpenCV pour Android à la suite de la les instructions ici et ajout de la Bibliothèque OpenCV 2.4.2 comme un projet de bibliothèque pour mon propre projet android comme les instructions de l'état.
Cependant quand je compile à la norme "Programme" Hello World"), comme suit,
il ne parvient pas, si je comprend le Mat mat = new Mat();
ligne, mais réussit autrement.
package com.example;
import org.opencv.core.Mat;
import android.app.Activity;
import android.os.Bundle;
public class HelloAndroidActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Mat mat = new Mat();
}
}
Voici la trace de la pile il imprime:
07-23 09:59:43.835: E/AndroidRuntime(8222): FATAL EXCEPTION: main
07-23 09:59:43.835: E/AndroidRuntime(8222): java.lang.UnsatisfiedLinkError: n_Mat
07-23 09:59:43.835: E/AndroidRuntime(8222): at org.opencv.core.Mat.n_Mat(Native Method)
07-23 09:59:43.835: E/AndroidRuntime(8222): at org.opencv.core.Mat.<init>(Mat.java:181)
07-23 09:59:43.835: E/AndroidRuntime(8222): at com.example.HelloAndroidActivity.onCreate(HelloAndroidActivity.java:15)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.app.Activity.performCreate(Activity.java:4538)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.app.ActivityThread.access$600(ActivityThread.java:139)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.os.Looper.loop(Looper.java:154)
07-23 09:59:43.835: E/AndroidRuntime(8222): at android.app.ActivityThread.main(ActivityThread.java:4977)
07-23 09:59:43.835: E/AndroidRuntime(8222): at java.lang.reflect.Method.invokeNative(Native Method)
07-23 09:59:43.835: E/AndroidRuntime(8222): at java.lang.reflect.Method.invoke(Method.java:511)
07-23 09:59:43.835: E/AndroidRuntime(8222): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-23 09:59:43.835: E/AndroidRuntime(8222): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-23 09:59:43.835: E/AndroidRuntime(8222): at dalvik.system.NativeStart.main(Native Method)
Deux choses à noter: je ne suis pas directement à l'aide de quelque chose de natif dans ce code (à l'instar de certains autres questions ici) et l'ancien OpenCV 2.3.x de la bibliothèque a très bien fonctionné avant d'utiliser la même méthode. Les deux projets Android ont la même cible et API pris en charge les paramètres.
L'ajout de ce code résolu mon problème.
static{ System.loadLibrary("opencv_java3"); }
OriginalL'auteur Jason | 2012-07-23
Vous devez vous connecter pour publier un commentaire.
Pensé à elle. N'était pas la liaison statique de la bibliothèque. Si vous utilisez ce code au lieu de cela, il fonctionne.
Cependant, pas trop friands de cette "OpenCV" Gestionnaire idée. Fait-il si l'utilisateur a l'installer plusieurs paquets manuellement avant que l'application fonctionne.
Avez-vous essayer d'utiliser mon code?
Nan je n'ai pas essayé votre code..mais maintenant mon problème est résolu..mon erreur a été vraiment vry idiot...c'est que j'ai défini Mat m = Mat(), avant d'appeler la bibliothèque..donc il a donné l'erreur..mais il a été invisible pendant 2 jours..
Haha nice. Content que vous l'avez résolu. Je suis sûr que j'ai eu des problèmes similaires.
Merci @Rekha pour raconter votre "bête" erreur! J'ai été en utilisant OpenCV classes entre les différentes classes et j'ai fait la même erreur. Votre commentaire résolu! 🙂
OriginalL'auteur Jason
La solution est de faire comme dans @Jason réponse, qui se trouve sur l'utilisation de la OpenCV Manager. Il est également expliqué en détail sur le la documentation officielle ici.
Mais comme @Jason dit, "Fait-il si l'utilisateur a l'installer solidairement paquets manuellement avant que l'application fonctionnera". Bien que cela est vrai, OpenCV Gestionnaire de a certains avantages comme par exemple:
Si OpenCV est mis à jour, l'utilisateur a seulement besoin de mettre à jour le/directeur de bibliothèque. Les applications qui utilisent le gestionnaire peut rester le même.
Votre application apk taille sera beaucoup plus petite:
Même ainsi, si vous souhaitez déployer vos applications de façon traditionnelle, liaison statique, vous pouvez lire les instructions ici.
Vrai, je n'ai pas suivi les développements récents, mais il devrait y avoir un mécanisme pour les applications de contrôle qui vont de des versions, ils sont compatibles avec. Si il n'y en a pas, c'est un problème.
Une autre variante est d'avoir plusieurs cibles APK pour chacun des 4 ciblées cpu arquitectures (ou un seul, x86 et mips ne sont pas que étendu). Cela ne donne que 4 mo de frais généraux, ce qui devrait être ok.
De ce que j'ai vu récemment, il y a des constantes statiques qui vous permet d'affirmer la version du manager est en cours d'exécution.
Le lien pour la liaison statique aide vraiment! merci u (+1)
OriginalL'auteur Rui Marques
Vous pouvez charge statique de l'open cv de bibliothèque partout dans votre activité.
Recherche la .donc fichier dans votre jniLibs dossier et copier/coller en tant qu'argument de "loadLibrary" méthode sans la lib préfixe.
OriginalL'auteur Lorenzo Franco Ranucci