Unsatisfiedlinkerror dans android (eclipse)
Je suis en train de lancer un simple jni code dans Android, Mais tout ce que je suis Unsatisfiedlinkerror .
Voici mon code Java:
package com.lipcap;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
TextView a;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
a=new TextView(this);
String b;
MainActivity ob=new MainActivity();
b=ob.sniff();
a.setText(b);
setContentView(a);
}
public native String sniff();
static{
System.loadLibrary("native");
}
}
Et voici Mon code C++ (en $PROJECT_PATH/jni/):
#include<iostream>
#include<string.h>
#include<jni.h>
JNIEXPORT jstring JNICALL Java_com_lipcap_MainActivity_sniff
(JNIEnv *env, jobject obj){
return env->NewStringUTF("This is Native");
}
J'ai respecté le code java à l'aide de javac, et fait l'en-tête à l'aide de javah.
Ensuite, j'ai couru ndk-build.
Et puis j'ai couru code à partir d'eclipse.(installé l'apk sur android).
J'obtiens cette erreur:
E/AndroidRuntime( 769): FATAL EXCEPTION: main
E/AndroidRuntime( 769): java.lang.UnsatisfiedLinkError: sniff
E/AndroidRuntime( 769): at com.lipcap.MainActivity.sniff(Native Method)
E/AndroidRuntime( 769): at com.lipcap.MainActivity.onCreate(MainActivity.java:36)
E/AndroidRuntime( 769): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 769): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime( 769): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime( 769): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime( 769): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime( 769): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 769): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 769): at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 769): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 769): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 769): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 769): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 769): at dalvik.system.NativeStart.main(Native Method)
Je n'ai pas mis LD_LIBRARY_PATH.
Cependant,sans LD_LIBRARY_PATH exemple de code comme HelloJNI fournis par NDK fonctionne tout à fait bien.
S'il vous plaît dites-moi où je suis absent.
MainActivity ob=new MainActivity();
Pourquoi? vous êtes déjà dans une instance de MainActivity.this.sniff()
doit être utilisé.- Oui, cette.sniff pourrait être utilisé. De toute façon, cela ne crée pas de différence dans la mesure où Unsatisfiedlinkerror est concerné.
- Changement de code C++ à C tout fonctionne bien.. 🙂
Vous devez vous connecter pour publier un commentaire.
Richard-tête que vous avez mentionné: "Modification de code C++ à C tout fonctionne bien"...
J'ai été torturé par exactement le même problème depuis plusieurs jours et je n'ai assurez-vous que tout tapé par moi (nommage, Android.mk etc.) n'a pas de problème. Chaque fois que dans C, je vais bien. Tant que j'ai du changer au rpc,
UnsatisfiedLinkError
.J'ai finalement obtenu l'indicateur à partir de ce lien:
http://markmail.org/message/fhbnprmp2m7ju6lc
C'est à cause du C++ name mangling! La même fonction, si vous n'avez pas
extern "C"
qui l'entoure dans la .fichier cpp, le nom est mutilé de la sorte JNI ne peut pas trouver le nom de la fonction, de sorteUnsatisfiedLinkError
pop-up.Mettre et à enlever la
extern "C" { }
autour de vos fonctions, exécuteznm obj/local/armeabi/libnative.so
, vous verrez clairement la même fonction avec et sans nom d'amputation.J'espère que cela aide d'autres avec le même problème.
Ce n'est pas vraiment été appelé tout à fait raison...
Essayer:
Enfin... est-ce que dans votre Android.mk?
Je vais vous donner un autre conseil.J'ai eu ce même message d'erreur avant, mais j'ai résolu ce problème par le biais de "Natif Android Kit de Développement de livre de cuisine".Veuillez noter que ces déclarations;
La fonction native doit suivre un modèle spécifique pour un nom de package, classe, nom, et le nom de la méthode.Le package et le nom de classe doit être en accord avec le package et le nom de classe de la classe Java à partir de laquelle la méthode native est appelée, alors que le nom de la méthode doit être le même que le nom de la méthode déclarée dans la classe Java.
Cela permet à l'Dalvik VM pour localiser la fonction native à l'exécution.Ne pas suivre la règle entraînera UnsatisfiedLinkError au moment de l'exécution.
Pour l'exemple ci-dessus
Vous avez besoin de changer votre nom de la fonction comme (n'utilisez pas de com.bla dans les noms de package si vous vous concentrez sur NDK)