我试图在
Android中运行一个简单的jni代码,但所有我得到的不满意的链接错误.
这是我的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"); } }
这是我的C代码(在$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"); }
我使用javac编写了java代码,并使用javah编写了头文件.
然后我跑了ndk-build.
然后我从eclipse运行代码.(在android中安装apk).
我收到此错误:
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)
我没有设置LD_LIBRARY_PATH.
但是,如果没有设置LD_LIBRARY_PATH,NDK提供的HelloJNI等示例代码运行绝对正常.
请告诉我我失踪的地方.
解决方法
Richard-head你提到:“将代码从C改为C一切正常”……
几天我被完全相同的问题折磨了,我确实确保我输入的所有内容(命名,Android.mk等)都没有问题.每当在C,我很好.只要我改为cpp,UnsatisfiedLinkError.
我终于得到了这个链接的提示:
http://markmail.org/message/fhbnprmp2m7ju6lc
这都是因为C名称错!同样的函数,如果.cpp文件中没有外部“C”,则名称会被破坏,因此JNI无法找到函数名称,因此会弹出UnsatisfiedLinkError.
在你的函数周围加上和删除extern“C”{},运行nm obj / local / armeabi / libnative.so,你会清楚地看到相同的函数没有和名称变形.
我希望这也可以帮助其他人解决同样的问题.