2012-06-22 1 views
0

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.

Répondre

1

liaison dynamique Utilisé en copiant le libopencv_java.so et les fichiers de bibliothèque * .a statiques dans le (dir projet)/libs et (dir projet)/obj/dossiers locaux et des blocs modifiés statique du code source java à

Vous devez copier uniquement libopencv_java.so (fichier *.a n'est pas nécessaire) à (Project dir)/libs/armeabi-v7a.

Vous avez également:

public native String funtionName1(); 

Mais dans le code natif c il n'y a que ces fonctions:

jstring Java_my_package_ocvtest1_OCVTest1 (JNIEnv *ptr, jobject obj) // mistake? 
jstring Java_my_package_ocvtest1_OCVTest1_functionName2 (JNIEnv *ptr, jobject obj) 

Il semble que le nom de la première fonction est erronée.

Cela devrait résoudre votre problème.

+1

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. –

+0

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? –

+0

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 –

Questions connexes