Gens,
Je travaille sur une application Android pour laquelle j'ai besoin d'une bibliothèque tierce .so. J'ai construit Cette bibliothèque tierce (avec ndk-build) conformément à leurs instructions et je cherchais ensuite À inclure ce .so dans mon projet Android.
Par conséquent, j’ai suivi les étapes décrites dans docs/PREBUILTS.html et construit avec succès le nouveau fichier Dans le répertoire jni/prebuilt. Maintenant, j'ai essayé de tirer parti des installations .so en l'utilisant dans une application de test Android simple. Donc ce que je fais c'est:
static {
Log.i("load so > ","load so");
System.loadLibrary("xyz");
}
/* The native functions */
private static native int openFile(String filename);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try{
String path = getPathForDownloadDirectoryFile();
Log.i("file path> ", path);
int num= openFile(path);
}catch(Exception e){
Log.e(">", "could not open the file");
}
}
Maintenant, lorsque je lance mon application, un message de débogage s'affiche indiquant: Aucun JNI_OnLoad trouvé dans /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738, ignorant init , Puis le l'application se ferme.
Pour plus d'informations, voici le journal des erreurs:
No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0, skipping init
W/dalvikvm( 570): No implementation found for native Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I
D/AndroidRuntime( 570): Shutting down VM
W/dalvikvm( 570): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
E/AndroidRuntime( 570): FATAL EXCEPTION: main
E/AndroidRuntime( 570): Java.lang.UnsatisfiedLinkError: Native method not found: com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.openFile(Native Method)
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.onCreate(MainActivity.Java:31)
E/AndroidRuntime( 570): at Android.app.Activity.performCreate(Activity.Java:5008)
E/AndroidRuntime( 570): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1079)
E/AndroidRuntime( 570): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2023)
E/AndroidRuntime( 570): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2084)
E/AndroidRuntime( 570): at Android.app.ActivityThread.access$600(ActivityThread.Java:130)
E/AndroidRuntime( 570): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1195)
E/AndroidRuntime( 570): at Android.os.Handler.dispatchMessage(Handler.Java:99)
E/AndroidRuntime( 570): at Android.os.Looper.loop(Looper.Java:137)
E/AndroidRuntime( 570): at Android.app.ActivityThread.main(ActivityThread.Java:4745)
E/AndroidRuntime( 570): at Java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 570): at Java.lang.reflect.Method.invoke(Method.Java:511)
E/AndroidRuntime( 570): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:786)
E/AndroidRuntime( 570): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:553)
E/AndroidRuntime( 570): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 146): Force finishing activity com.example.mysecondapp/.MainActivity
Comme je pouvais le constater, l'implémentation native de la méthode openFile () n'a pas été trouvée, mais le même fichier xyz.so lib a fonctionné de manière plutôt ordonnée avec l'exemple d'application d'origine de la tierce partie. Je suis à peu près un démarreur avec le monde Android-ndk.
Java-Android-NDK Ninjas ... vous avez une idée de ce qui pourrait me manquer? J'apprécierais beaucoup toute aide ici :)
Comme l'a dit guycole, "No JNI_OnLoad" n'est qu'un avertissement, votre problème est ailleurs.
Comme vous avez mentionné que votre fichier "so" a été compilé avec succès, le problème réside peut-être dans les signatures de vos fonctions dans votre code c/C++, cela devrait ressembler à ceci:
JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f)
{
//some action
}
Les signatures de fonction proviennent du fichier d'en-tête généré à l'aide de l'outil javah.Vous devez générer un fichier d'en-tête et utiliser la signature de fonction avec le nom de votre package. Pour différents noms de paquet et de classe, le fichier d'en-tête et la signature de fonction correspondante changeront.
worked pretty neat with the original sample app from the third party
Cela peut être la raison pour laquelle il est exécuté sur l'exemple d'application et non sur votre application.
voir: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_Android_apps
Le message "No JNI_OnLoad" n'est qu'un avertissement. JNI_OnLoad est un hook d’initialisation optionnel.
Je suppose que votre problème réside dans la méthode openFile (). Essayez de commenter l'appel de Java et voyez jusqu'où vous allez.
J'ai un article sur JNI et quelques exemples de code sur http://guycole.blogspot.com/2012/03/yet-another-Android-ndk-blog-posting.html - peut-être le trouverez-vous utile .
Bonne chance.
Il vient aussi avec ce journal
?? - ?? ??: ??: ??. ???: INFO/(): Java.lang.UnsatisfiedLinkError: Impossible de charger * : findLibrary a renvoyé la valeur null.
droite??
Je pense que c'est le problème des fichiers Android.mk. 1: essayez de passer à armabi v7. 2: load funciton appellera open (). vérifier la permission du so.
Comme mentionné dans les réponses précédentes, No JNI_OnLoad n'est qu'un avertissement.
J'avais un problème similaire, je pensais que le problème était dû aux opérations sur les fichiers.
Mon application ne disposait pas de l'autorisation d'écriture sur le stockage externe. Après avoir ajouté le code ci-dessous dans le manifeste , Il fonctionnait correctement.