【问题标题】:Android NDK. No implementation found for native Lcom安卓 NDK。未找到本机 Lcom 的实现
【发布时间】:2013-11-14 17:00:58
【问题描述】:

毕竟我已经设法为 NDK“准备”我的 Eclipse(至少我认为是这样),它不再争论 c 代码,但现在我得到“没有找到本机 Lcom 的实现”每当我执行任何本机代码.. 它也发生在 NDK 的示例中..

我的.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;
}

我的.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := shit
LOCAL_SRC_FILES := shit.cpp

include $(BUILD_SHARED_LIBRARY)

我的错误日志

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)
...

为什么我会得到那个该死的“找不到原生的实现”???

【问题讨论】:

    标签: java android c++ android-ndk java-native-interface


    【解决方案1】:

    由于您的 JNI 函数位于 C++ 源文件中,因此需要将其声明为 extern "C" 以与 JNI 兼容。否则,C++ 名称修饰会妨碍动态链接。

    此外,您的本机方法不返回值。应该是编译错误。

    所以将 C 函数替换为:

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

    【讨论】:

    • extern "C"{...}包围你的C++函数
    • 我不敢相信,但它有帮助!太感谢了!你能解释一下为什么它有帮助吗?愚蠢的我,现在我明白了..再次感谢您)
    • C++ 名称修改妨碍了动态链接 - SO 文件中的 C++ 函数不再称为 Java_com_example_shit_MainActivity_piextern "C" 防止这种情况发生。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多