我正在尝试将 NDK 与 C++ 一起使用,但似乎无法获得正确的方法命名约定。我的原生方法如下:

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

标头也用 extern "C" {} 包裹。

一切都编译得很好,创建了一个 .so 文件并复制到我的项目下的 libs 文件夹,但是当我在 Eclipse 中调试和运行时,我不断收到一条日志消息,指出“没有找到本机的实现...”。由于所有 NDK 示例都是用 C 语言编写的,我是否遗漏了一些东西?

谢谢。

有帮助吗?

解决方案

有几件事情,可能导致“没有实现找到”。一是获取函数原型的名字错了,另一个是失败在所有加载的.so。你确定所使用的方法之前System.loadLibrary()被称为?

如果你没有一个JNI_OnLoad功能定义做,你可能要创建一个,并让它吐出日志消息只是为了验证该库在成功得到拉升。

您已经躲过了最常见的问题 - 忘记使用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
    ...

我无法让Android的动态链接到我的本地方法,直到我去掉了下划线:

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 

请注意细节的 + = 代替的:=

我希望有所帮助。

调用的extern“C”作为在自动生成的工作室实例而提供,但忘了包裹文件的整个其余部分,包括以下功能,在{}括号。只有第一个功能工作。

的另一个原因:使用LOCAL_WHOLE_STATIC_LIBRARIES代替android.mk LOCAL_STATIC_LIBRARIES。这从优化了未使用的API调用,因为NDK不能从Java代码检测使用天然绑定停止库。

使用JAVAH(Java SDK中的一部分)。其准确地这样做的工具(从生成的.class文件.H头)。

如果您的包名称包括_字符,则应该如下所示写1(一)后_字符:

MainActivity.java

package com.example.testcpp_2;

本机lib.cpp

JNICALL
Java_com_example_testcpp_12_MainActivity_stringFromJNI(

我尝试所有上述解决方案,但没有人能解决我的生成错误(JNI java.lang.UnsatisfiedLinkError中:没有执行发现...) 最后我发现,我忘了我的verify.cpp源文件添加到CMakeList.txt add_library segement(verify.cpp是自动按Ctrl +生成输入快捷键,也许其他文件名),希望我的回答可以帮助一些之一。

我的生成环境:摇篮+ CMake的

我面临同样的问题,在我的情况的原因是,我不得不在包名下划线“RFID_Test” 我改名为包装和它的工作。 感谢user1222021

我两次遇到同样的问题。碰巧,我尝试从 Android Studio 启动应用程序的手机使用了 API级别 我还没有在 Android Studio 中下载。

  1. 将Android Studio升级到最新版本
  2. 从 Android Studio 中下载必要的 API
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top