Java 安卓NDK。未找到本机Lcom的实现

Java 安卓NDK。未找到本机Lcom的实现,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,毕竟我已经成功地为NDK“准备”了eclipse(至少我认为是这样),它在c代码上不再有争议,但现在我在任何时候执行任何本机代码时都会发现“没有为本机Lcom找到实现”。。这也发生在NDK的样品上 My.java ... private native float pi(); static { System.loadLibrary("shit"); } ... System.out.println(pi()); ... 我的.cpp #include <jni.h>

毕竟我已经成功地为NDK“准备”了eclipse(至少我认为是这样),它在c代码上不再有争议,但现在我在任何时候执行任何本机代码时都会发现“没有为本机Lcom找到实现”。。这也发生在NDK的样品上

My.java

...    
private native float pi(); 
static
{
    System.loadLibrary("shit");
}
...
System.out.println(pi());
...

我的.cpp

#include <jni.h>

jfloat Java_com_example_shit_MainActivity_pi(JNIEnv * env, jobject obj) {
    return 3.1415;
}

我的错误日志

11-14 18:30:16.231: D/dalvikvm(1739): Trying to load lib /data/data/com.example.shit/lib/libshit.so 0x413b1fc8
11-14 18:30:16.241: D/dalvikvm(1739): Added shared lib /data/data/com.example.shit/lib/libshit.so 0x413b1fc8
11-14 18:30:16.241: D/dalvikvm(1739): No JNI_OnLoad found in /data/data/com.example.shit/lib/libshit.so 0x413b1fc8, skipping init
11-14 18:30:16.271: D/TextLayoutCache(1739): Using debug level: 0 - Debug Enabled: 0
11-14 18:30:17.913: W/dalvikvm(1739): No implementation found for native Lcom/example/shit/MainActivity;.pi ()F
11-14 18:30:17.913: D/AndroidRuntime(1739): Shutting down VM
11-14 18:30:17.913: W/dalvikvm(1739): threadid=1: thread exiting with uncaught exception (group=0x40ab1210)
11-14 18:30:17.923: E/AndroidRuntime(1739): FATAL EXCEPTION: main
11-14 18:30:17.923: E/AndroidRuntime(1739): java.lang.IllegalStateException: Could not execute method of the activity
...
11-14 18:30:17.923: E/AndroidRuntime(1739):     at dalvik.system.NativeStart.main(Native Method)
...
11-14 18:30:17.923: E/AndroidRuntime(1739): Caused by: java.lang.UnsatisfiedLinkError: pi
11-14 18:30:17.923: E/AndroidRuntime(1739):     at com.example.shit.MainActivity.pi(Native Method)
11-14 18:30:17.923: E/AndroidRuntime(1739):     at com.example.shit.MainActivity.doit(MainActivity.java:31)
...


为什么我要得到该死的“没有为本地找到的实现”???< /p> ,因为你的JNI函数在C++源文件中,所以需要声明为“外部”C,以与JNI兼容。否则,C++名称的篡改将妨碍动态链接。 此外,本机方法不会返回值。这应该是一个编译错误

因此,将C函数替换为:

extern "C" {

jfloat Java_com_example_shit_MainActivity_pi(JNIEnv * env, jobject obj) {
    return 3.14;
}

}

围绕你的C++函数用<代码>外“C”{ } /代码>我不能相信,但它有帮助!非常感谢你!你能解释一下为什么它有用吗??让我哑口无言,现在我明白了。。再次感谢C++的名字Mangle,这是动态链接的方式——SO文件中的C++函数不被称为“代码> javaSoCyMaqPythHyMeActuviyPix< /Cord>”。代码>外部“C”阻止了这种情况。
extern "C" {

jfloat Java_com_example_shit_MainActivity_pi(JNIEnv * env, jobject obj) {
    return 3.14;
}

}