java - 安卓NDK。未找到原生 Lcom 的实现

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

毕竟我已经为 NDK 设法“准备”了我的 eclipse(至少我是这么认为的),它不再在 c 代码中争论了,但是现在我在执行任何时候都得到“没有找到本地 Lcom 的实现” native 代码..它也发生在 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)
...

为什么我会收到该死的“未找到 native 实现”???

最佳答案

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

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

因此将 C 函数替换为:

extern "C" {

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

}

关于java - 安卓NDK。未找到原生 Lcom 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19983768/

相关文章:

java - 无法存储作业 : Driver's Blob representation is of an unsupported type: oracle. sql.BLOB [请参阅嵌套异常 : java. sql.SQLException

Android Studio : Duplicate files copied in APK project. 属性

c++ - Qt designer如何抓取信息

java - 有没有办法检索java源文件?

java - 如何在 swift 中将字符串(在 Java 中使用加密 MessageDigest)编码为 Base64 字符串?

android - 如何使用 ListView 实现长按?

c++ - 具有对象右值引用的线程

c++ - 实现特定 std::mbstate_t 的大小

java - 另一个 java.lang.ClassCastException

java - 如何在android中导入特定版本的 Fabric