Android 安卓NDK C++;JNI(未找到本机的实现…) 我试图用C++来使用NDK,但似乎无法使方法命名约定正确。我的原生方法如下: extern "C" { JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni (JNIEnv* env, jclass c) { // } }

Android 安卓NDK C++;JNI(未找到本机的实现…) 我试图用C++来使用NDK,但似乎无法使方法命名约定正确。我的原生方法如下: extern "C" { JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni (JNIEnv* env, jclass c) { // } },android,android-ndk,Android,Android Ndk,使用外部“C”{}aslo包装头 一切都编译得很好,创建了一个.so文件并复制到我的项目下的libs文件夹中,但是当我在Eclipse中调试和运行时,我不断收到一条日志cat消息,“没有找到本机的实现…”。由于所有NDK示例都是C语言,我是否缺少一些东西 谢谢。ndk中的应用程序下有一个cpp示例: 有两种情况可能导致“未找到实现”。一个是函数原型名称错误,另一个是加载失败。所以。是否确定在使用该方法之前调用了System.loadLibrary() 如果没有定义JNI_OnLoad函数,则可能

使用外部“C”{}aslo包装头

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


谢谢。

ndk中的应用程序下有一个cpp示例:

有两种情况可能导致“未找到实现”。一个是函数原型名称错误,另一个是加载失败。所以。是否确定在使用该方法之前调用了
System.loadLibrary()

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


您已经避开了最常见的问题——忘记使用
extern“C”
——因此要么是上面提到的问题,要么是一些轻微的拼写错误。Java声明是什么样子的?

使用javah(JavaSDK的一部分)。它正是用于此目的的工具(从.class文件生成.h头)。

我也有同样的问题,但对我来说,错误出现在文件Android.mk中。我有:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES := B.cpp 
但我们应该做到:

LOCAL_SRC_FILES := A.cpp
LOCAL_SRC_FILES += B.cpp 
注意细节+=而不是:=


我希望这会有所帮助。

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

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

例如,我想导出一个名为
AudioCapture\u-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!
    ...

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

我尝试了以上所有解决方案,但没有人能解决我的构建错误(jni java.lang.UnsatisfiedLinkError:找不到…)的实现, 最后我发现我忘了将我的verify.cpp源文件添加到CMakeList.txt add_library segment(verify.cpp是通过Ctrl+Enter快捷键自动生成的,可能是其他文件名),希望我的回答能帮助一些人


我的构建环境:Gradle+CMake

我面临同样的问题,在我的例子中,原因是我在包名“RFID\u Test”中有下划线 我重新命名了这个包,它成功了。
感谢用户1222021如果您的软件包名称包含u字符,则应在u字符后写1(一),如下所示:

MainActivity.java

package com.example.testcpp_2;
native-lib.cpp

JNICALL
Java_com_example_testcpp_12_MainActivity_stringFromJNI(

我两次面对同样的问题。碰巧,我试图从Android Studio启动应用程序的手机使用了一个我还没有在Android Studio下载的API级别

  • 将Android Studio升级至最新版本
  • 从Android Studio中下载必要的API

  • 您是否使用
    javah
    生成JNI存根?如果没有,您应该:-p很可能是因为您没有调用
    System.loadLibrary
    谢谢您的提问。今天我学到了一个新东西。你可以在android ndk/samples/hello-gl2中找到cpp文件,它是android ndk的一部分distribution@pevik它又死了。@Mygod Fixed()链接又死了!你为我节省了几个小时的工作时间——读到这篇文章时,我刚刚想起我的loadLibrary电话被评论掉了……你也救了我!我四次检查了我的函数名和其他一些东西。。。但是我忘记了外部代码“C”,甚至在问题中都没有注意到!现在在Android文档网站上:还有一个没有人告诉过的例子:你不能在函数名中使用“_”(下划线),因为下划线被定义为包分隔符。因此,仅使用驼峰大小写函数名possible@Nulik:如果您将“\u”作为“\u 1”,则可以使用“\u”。其中的区别是:“在android.mk中使用本地\u全局\u静态\u库而不是本地\u静态\u库”,或者您可以将它们全部添加到一行中,或者使用“\`换行符”。Java语言声明中出现的“\u”必须替换为本机声明中的“_1”。请参见中的表2-1。这很明显,但经过几个小时的调试后,我没有设法自己解决它…谢谢,你救了我!@user1222021我有一个问题,我们可以为项目中的所有活动导出cpp方法吗?我们是否需要在.cpp文件中的方法中指定活动名称?