Android中不满意的链接错误(eclipse)

d34*_*k3r 6 eclipse java-native-interface android android-ndk

我试图在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");
    }


} 
Run Code Online (Sandbox Code Playgroud)

这是My 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");
}
Run Code Online (Sandbox Code Playgroud)

我使用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)
Run Code Online (Sandbox Code Playgroud)

我没有设置LD_LIBRARY_PATH.

但是,如果没有设置LD_LIBRARY_PATH,NDK提供的HelloJNI等示例代码运行绝对正常.

请告诉我我失踪的地方.

小智 12

Richard-head你提到:"将代码从C++改为C一切正常"......

几天我被完全相同的问题折磨了,我确实确保我输入的所有内容(命名,Android.mk等)都没有问题.每当在C,我很好.只要我改变CPP, UnsatisfiedLinkError.

我终于从这个链接得到了提示:http: //markmail.org/message/fhbnprmp2m7ju6lc

这都是因为C++名称错误!相同的函数,如果你没有extern "C"在.cpp文件中包含它,名称会被破坏,所以JNI找不到函数名,所以UnsatisfiedLinkError弹出.

穿上并移除extern "C" { }你的功能,运行nm obj/local/armeabi/libnative.so,你会清楚地看到相同的功能没有和名称损坏.

我希望这也可以帮助其他人解决同样的问题.


Max*_*mus 0

这实在是不太正确...

尝试:

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;

    public native String sniff();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        a=new TextView(this);

        String b = sniff(); 

        a.setText(b);

        setContentView(a);
    }

    static{
        System.loadLibrary("native");
    }

}
Run Code Online (Sandbox Code Playgroud)

最后...这是在你的 Android.mk 中吗?

LOCAL_MODULE    := native
Run Code Online (Sandbox Code Playgroud)