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
- 无法在android中调用String.isEmpty()
- 如何在Android Studio中获取SHA-1指纹证书的debugging模式?
- 如何在Android Studio中使用ProGuard?
- 如何在一个button中有图像和文本中心
- 更新到Android构build工具后的IncompatibleClassChangeError 25.1.6 GCM / FCM
- Android Studio找不到与com.android.support:appcompat-v7:+相匹配的任何版本
- 用Javascript检测触摸屏设备
- Android如何创build运行时缩略图
- Gradle的DSL方法没有find:'compile()'