Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android(eclipse)中的不满意链接错误_Android_Eclipse_Java Native Interface_Android Ndk - Fatal编程技术网

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

android(eclipse)中的不满意链接错误,android,eclipse,java-native-interface,android-ndk,Android,Eclipse,Java Native Interface,Android Ndk,我试图在Android中运行一个简单的jni代码,但我得到的都是不满意的LinkError 以下是我的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

我试图在Android中运行一个简单的jni代码,但我得到的都是不满意的LinkError

以下是我的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++代码(在$jpjtPosith/jnI/)中:

我没有设置LD_LIBRARY_路径

但是,如果不设置LD_LIBRARY_路径,NDK提供的HelloJNI之类的示例代码运行起来绝对正常


请告诉我我失踪的地方。

这并不是很对

尝试:

最后。。。这在你的Android.mk中吗

LOCAL_MODULE    := native

<李察>你提到:“从C++到C的代码都会变好”……/P> 我被同样的问题折磨了好几天,我确实确保我输入的所有东西(命名、Android.mk等)都没有问题。无论何时在C,我都很好。只要我改为cpp,
未满足链接错误

我终于从这个链接中得到了提示:

这都是因为C++名字的错误!相同的函数,如果在.cpp文件中没有
extern“C”
围绕它,则名称会被损坏,因此JNI无法找到函数名称,因此会弹出
unsatifiedLinkError

打开并删除函数周围的
extern“C”{}
,运行
nmobj/local/armeabi/libnative。因此
,您将清楚地看到相同的函数没有名称损坏,也有名称损坏


我希望这也能帮助其他人解决同样的问题。

我将给出另一个建议。我以前也遇到过同样的错误,但我通过“Android本机开发工具包食谱”解决了这个问题。请注意以下陈述

本机函数必须遵循包名、类名和方法名的特定模式。包名和类名必须与调用本机方法的Java类的包名和类名一致,而方法名必须与该Java类中声明的方法名相同。 这有助于Dalvik VM在运行时定位本机函数。如果不遵守规则,将导致运行时出现不满意的LinkError。

例如上面的例子

您需要更改函数名,如(如果您关注NDK,请不要在包名中使用com.bla)

#包括
#包括
#包括
JNIEXPORT jstring JNICALL Java\u lipcap\u示例\u MainActivity\u sniff
(JNIEnv*env,jobject对象){
return env->NewStringUTF(“这是本地的”);
}

MainActivity ob=新的MainActivity()为什么?您已进入MainActivity的实例<必须使用code>this.sniff()
。是的,可以使用this.sniff。无论如何,这并没有造成任何差异,就Unsatisfiedlinkerror而言。将代码从C++转换为C的一切都很好。检查编辑。。。Android.mk中的模块名应该与正在加载的库名匹配。此外,在Java中声明的顺序并不重要。是的。。这在我的Android.mk LOCAL_模块中:=native
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)
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");
    }

}
LOCAL_MODULE    := native
#include<iostream>
#include<string.h>
#include<jni.h>

JNIEXPORT jstring JNICALL Java_lipcap_example_MainActivity_sniff
(JNIEnv *env, jobject obj){
       return env->NewStringUTF("This is Native");
}