Android NDK C ++ JNI(找不到原生的实现…)

我正在尝试使用C ++的NDK,并且似乎无法正确获取方法命名约定。 我的本地方法如下:

extern "C" { JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni (JNIEnv* env, jclass c) { // } } 

带有一个包裹在extern“C”{}中的头文件。

一切编译好,创build一个.so文件,并复制到我的项目下的libs文件夹,但是当我在Eclipse中debugging和运行时,我不断得到一个日志猫消息,“没有实现发现本地…”。 有什么我失踪,因为所有的NDK例子是在C?

谢谢。

有一些事情可能会导致“未find实现”。 一个是函数原型名称错误,另一个是根本没有加载.so。 你确定在使用该方法之前调用System.loadLibrary()吗?

如果你没有定义一个JNI_OnLoad函数,你可能需要创build一个函数,并且只是为了validation这个函数库是否被成功拉出了日志信息。

您已经避开了最常见的问题 – 忘记使用extern "C" – 因此它可能是上述或轻微的拼写错误。 Java声明是什么样的?

此错误的另一个原因:您的未装饰的本机方法名称不得包含下划线!

例如,我想导出名为AudioCapture_Ping()的C函数。 这是我在C:

 JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object); //Notice the underscore before Ping 

这是我的Java类导入函数:

 package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapture_Ping(); // FAILS ... 

我不能让Androiddynamic链接到我的本地方法,直到我删除下划线:

 JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapturePing(JNIEnv *pJniEnv, jobject object); package com.obsidian.mobileaudiohashhost; ... public class MainActivity extends Activity { private native int AudioCapturePing(); // THIS WORKS! ... 

我有同样的问题,但对我来说,错误是在文件Android.mk。 我拥有它:

 LOCAL_SRC_FILES := A.cpp LOCAL_SRC_FILES := B.cpp 

但应该有这个:

 LOCAL_SRC_FILES := A.cpp LOCAL_SRC_FILES += B.cpp 

注意细节+ =代替:=

我希望有帮助。

另一个原因:在android.mk中使用LOCAL_WHOLE_STATIC_LIBRARIES而不是LOCAL_STATIC_LIBRARIES。 这会阻止库优化未使用的API调用,因为NDK无法检测到使用来自java代码的本地绑定。

在ndk的应用程序中有一个cpp示例: https : //android.googlesource.com/platform/development/+/marshmallow-release/ndk/platforms/android-5/samples/hello-gl2/jni/gl_code.cpp

使用javah(Java SDK的一部分)。 它的工具完全是这样的(从.class文件生成.h头文件)。

在自动生成的Studio示例中提供了被称为extern“C”的内容,但是忘记将包括以下函数在内的整个文件的其余部分封装在{}括号中。 只有第一个function起作用。

我尝试以上解决scheme,但没有人能解决我的构build错误(jni java.lang.UnsatisfiedLinkError:没有find实现…),最后我发现我忘了添加我的verify.cpp源文件到CMakeList.txt add_library segement(verify.cpp是通过Ctrl + Enter短键自动生成的,也许是其他文件名),希望我的回复能帮到一些。

我的构build环境:Gradle + CMake

我面对同样的问题,在我的情况下,原因是我已经在包名称“RFID_Test”下划线,我重命名包,它的工作。 感谢user1222021