Je souhaite utiliser le code natif OpenCV 2.4.0 dans Android 2.3.3. Pour cela, j'ai utilisé NDK release-8 pour construire des bibliothèques partagées lib.so
en utilisant le script ndk-build.cmd
sur Windows 7. J'ai utilisé Eclipse pour créer un projet et générer le fichier .apk.UnsatisfiedLinkError levé lors de l'utilisation de code natif pour OpenCv sur Android 2.3.3
Voici le problème, je reçois une exception UnsatisfiedLinkError
levée lorsque j'essaie de charger les bibliothèques partagées en utilisant System.loadLibrary(
) dans le code Java. J'ai essayé de faire la même chose avec l'exemple hello-jni dans NDK, et cela fonctionne absolument bien. J'ai suivi les instructions sur this page pour créer un projet et pour écrire les fichiers Android.mk
et Application.mk
.
Voici mon code java:
package my.package.ocvtest1
// import android.foo.bar statements
public class OCVTest1 extends Activity
{
public void onCreate(Bundle savedInstance)
{
super.onCreate(Bundle savedInstance)
// code to display strings returned by native functions
}
public native String funtionName1();
public native String functionName2();
static
{
System.loadLibrary("ocvtest1");
}
}
Voici le fichier (Project dir)/jni/ocvtest1.c
qui mettent en œuvre des fonctions natives:
#include <jni.h>
// Other header files and some global variables
jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj)
{
// code here
}
jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj)
{
// code here
}
// End of file
J'ai googlé ce problème et avons essayé les solutions, et même après la mise en œuvre de ces solutions I obtenir cette exception. Voici toutes les choses que j'ai essayé jusqu'à présent:
liaison dynamique d'occasion en copiant le libopencv_java.so
et les fichiers de bibliothèque *.a
statiques dans les (Project dir)/libs
et (Project dir)/obj/local
dossiers et des blocs modifiés statique du code source java pour
static
{
System.loadLibrary("opencv_java");
System.loadLibrary("ocvtest");
}
Utilisé liaison statique en ajoutant OPENCV_LIB_TYPE:=STATIC
comme ci-dessous
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
include (<Path to Opencv.mk>)
fichier d'en-tête inclus généré par l'exécution de la commande dans javah.exe my.package.OCVTest1
invite lors de l'utilisation de la liaison dynamique.
Modifié armeabi-v7a
à armeabi
pour la variable de version abi dans le fichier Application.mk
.
Pour tous les changements ci-dessus, pour vous assurer que les fichiers de bibliothèque ont été chargés dans le dossier lib de l'application, j'exécuté
adb push <path to library on disk> <path to /lib in app>
qui a copié les fichiers de bibliothèque dans le répertoire approprié sur le téléphone.
Après avoir essayé tous ces correctifs, je ne suis toujours pas en mesure de résoudre cette exception.
J'ai changé le nom de la première fonction, puis essayé d'exécuter l'application sur le téléphone, jette encore l'exception d'erreur de liaison insatisfaite. J'ai essayé beaucoup de corrections mentionnées ailleurs sans succès. J'ai inclus le fichier d'en-tête généré par javah, essayé de liaison dynamique, fait en sorte que les bibliothèques sont dans le bon chemin dans le téléphone. –
En outre, tout en essayant la liaison statique en ajoutant la ligne 'OPENCV_LIB_TYPE: = STATIC' à Android.mk, les bibliothèques ne sont pas construites et à la place je reçois apparemment des erreurs de temps sans fin que je dois cesser d'utiliser Ctrl + C. Cela pourrait-il indiquer quelque désaccord quelque part dans le code? En outre, j'utilise Windows 7 et la page des développeurs Android pour NDK dit que ce n'est pas compatible avec Windows 7. Est-ce le problème? –
Ceci est une partie de la sortie du charabia dont je parlais: (.text._Z25cvHaarDetectObjectsForROCPKvP23CvHaarClassifierCascadeP12CvM emStomake: *** [obj/local/armeabi-V7A/libocvtest3.so] Erreur 3 Terminate traitement par lots (Y/N)? y –