我正在尝试将NDK与C++一起使用,但似乎无法获得正确的方法命名约定。我的原生方法如下:
extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
//
}
}
使用外部"C“{}包装的头部也是如此。
一切都编译得很好,创建了一个.so文件并复制到我的项目下的libs文件夹中,但是当我在Eclipse中调试和运行时,我一直收到一条log cat消息“没有找到本机的实现...”。我是不是遗漏了什么,因为所有的NDK示例都是用C编写的?
谢谢。
发布于 2010-03-20 05:03:18
有几件事可能会导致“找不到实现”。一个是函数原型名称错误,另一个是根本无法加载.so。是否确定在使用该方法之前调用了System.loadLibrary()
?
如果您没有定义JNI_OnLoad
函数,那么可能需要创建一个函数,并让它输出一条日志消息,以验证库是否被成功拉入。
您已经避免了最常见的问题--忘记使用extern "C"
--所以要么是上面的问题,要么是一些轻微的拼写错误。Java声明是什么样子的?
发布于 2014-02-08 03:51:38
此错误的另一个原因:未修饰的本机方法名不能包含下划线!
例如,我想导出一个名为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!
...
发布于 2017-07-14 06:44:06
调用了自动生成的Studio示例中提供的extern "C“,但忘记了将文件的其余部分包装在{}括号中,包括以下函数。只有第一个函数起作用了。
https://stackoverflow.com/questions/2197889
复制相似问题