首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android NDK C++ JNI (没有找到本机的实现...)

Android NDK C++ JNI (没有找到本机的实现...)
EN

Stack Overflow用户
提问于 2010-02-04 14:52:42
回答 9查看 101.9K关注 0票数 93

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

代码语言:javascript
复制
extern "C" {
JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni
(JNIEnv* env, jclass c)
{
   //
}
}

使用外部"C“{}包装的头部也是如此。

一切都编译得很好,创建了一个.so文件并复制到我的项目下的libs文件夹中,但是当我在Eclipse中调试和运行时,我一直收到一条log cat消息“没有找到本机的实现...”。我是不是遗漏了什么,因为所有的NDK示例都是用C编写的?

谢谢。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-03-20 05:03:18

有几件事可能会导致“找不到实现”。一个是函数原型名称错误,另一个是根本无法加载.so。是否确定在使用该方法之前调用了System.loadLibrary()

如果您没有定义JNI_OnLoad函数,那么可能需要创建一个函数,并让它输出一条日志消息,以验证库是否被成功拉入。

您已经避免了最常见的问题--忘记使用extern "C" --所以要么是上面的问题,要么是一些轻微的拼写错误。Java声明是什么样子的?

票数 167
EN

Stack Overflow用户

发布于 2014-02-08 03:51:38

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

例如,我想导出一个名为AudioCapture_Ping()的C函数。下面是我用C语言编写的出口声明:

代码语言:javascript
复制
JNI_EXPORT int Java_com_obsidian_mobilehashhost_MainActivity_AudioCapture_Ping(JNIEnv *pJniEnv, jobject object);  //Notice the underscore before Ping

下面是我导入函数的Java类:

代码语言:javascript
复制
package com.obsidian.mobileaudiohashhost;
...
public class MainActivity extends Activity {
    private native int AudioCapture_Ping();  // FAILS
    ...

我无法让Android动态链接到我的本机方法,直到我删除了下划线:

代码语言:javascript
复制
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!
    ...
票数 20
EN

Stack Overflow用户

发布于 2017-07-14 06:44:06

调用了自动生成的Studio示例中提供的extern "C“,但忘记了将文件的其余部分包装在{}括号中,包括以下函数。只有第一个函数起作用了。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2197889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档