JNI UnsatisfiedLinkError - méthode Native pas trouvé
Je suis en train d'utiliser JNI dans Android, mais reçois 'UnsatisfiedLinkError - méthode Native non trouvé". J'ai passé quelques heures à chercher des solutions, mais le problème persiste. Merci pour toute aide.
Mon code est comme suit:
Classe Java:
package com.example.icam;
public class Native {
static{
System.loadLibrary("nativeLib");
}
public static native int nativeFunction();
}
Fichier d'en-tête (générées à l'aide javah):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_icam_Native */
#ifndef _Included_com_example_icam_Native
#define _Included_com_example_icam_Native
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_icam_Native
* Method: nativeFunction
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_example_icam_Native_nativeFunction
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
Fichier source C++:
#include "com_example_icam_Native.h"
JNIEXPORT jint JNICALL Java_com_example_icam_Native_nativeFunction(JNIEnv * env, jclass clazz){
return (jint)1;
}
Mon Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
#OPENCV_LIB_TYPE:=SHARED
APP_ABI := armeabi-v7a
LOCAL_SRC_FILES := native.cpp
include C:\OpenCV-2.4.8-android-sdk\sdk\native\jni\OpenCV.mk
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := nativeLib
include $(BUILD_SHARED_LIBRARY)
Je suis très nouveau pour JNI, j'ai peut-être raté quelque chose?
Message d'erreur:
02-14 03:44:37.501: E/AndroidRuntime(23484): java.lang.UnsatisfiedLinkError: Native method not found: com.example.icam.Native.nativeFunction:()I
02-14 03:44:37.501: E/AndroidRuntime(23484): at com.example.icam.Native.nativeFunction(Native Method)
02-14 03:44:37.501: E/AndroidRuntime(23484): at com.example.icam.MainActivity.onCreate(MainActivity.java:81)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.app.Activity.performCreate(Activity.java:5231)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.app.ActivityThread.access$800(ActivityThread.java:135)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.os.Handler.dispatchMessage(Handler.java:102)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.os.Looper.loop(Looper.java:136)
02-14 03:44:37.501: E/AndroidRuntime(23484): at android.app.ActivityThread.main(ActivityThread.java:5017)
02-14 03:44:37.501: E/AndroidRuntime(23484): at java.lang.reflect.Method.invokeNative(Native Method)
02-14 03:44:37.501: E/AndroidRuntime(23484): at java.lang.reflect.Method.invoke(Method.java:515)
02-14 03:44:37.501: E/AndroidRuntime(23484): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-14 03:44:37.501: E/AndroidRuntime(23484): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-14 03:44:37.501: E/AndroidRuntime(23484): at dalvik.system.NativeStart.main(Native Method)
- Maintenant que vous avez édité une partie de l'erreur de votre question, merci de poster l'intégralité du message que vous avez obtenu à l'exception.
- Vous devez vous assurer que le symbole est présent dans votre .donc fichier, et le droit .si le fichier est sur votre appareil. Exécuter
arm-linux-androideabi-nm -D nativeLib.so
(où le nm binaire vit quelque part dans le NDK "toolchains" répertoire etnativeLib.so
est la bibliothèque extraites à partir de votre appareil avecadb pull
) voir la table des symboles. Aussi regarder au-dessus de l'exception dans le logcat sortie pour voir si la VM est en train de dire quelque chose d'intéressant. - J'ai couru à la ci-dessus, et le symbole était bien présent. Le code fonctionne réellement maintenant, je ne suis pas exactement sûr de ce que j'ai fait. Maintenant, je dois juste de commencer la rédaction de mon C++ néon-activé le code 🙂
- Vous avez modifié ce autant de fois qu'il est impossible pour quiconque de savoir quel est le véritable problème. Cette question devrait être supprimé.
Vous devez vous connecter pour publier un commentaire.
La fonction déclarée dans votre .c fichier n'est pas la fonction déclarée dans votre .h fichier, ou que la méthode native dans votre code Java soit. Vous avez changé le nom quelque part le long de la ligne sans garder le tout en parfaite synchronisation.
javah.
NB: Vous n'avez pas besoinextern "C"
dans le .c fichier. Y compris l' .h fichier fait pour vous.nativeIsNeon.
Si ce n'est pas le cas, veuillez mettre à jour votre post à tout ce courant.J'ai le même problème, je l'ai corrigé en changeant
Vous avez à nouveau construire votre .donc fichier par ndk_build