Android 安卓NDK C++;JNI(未找到本机的实现…) 我试图用C++来使用NDK,但似乎无法使方法命名约定正确。我的原生方法如下: extern "C" { JNIEXPORT void JNICALL Java_com_test_jnitest_SurfaceRenderer_drawFromJni (JNIEnv* env, jclass c) { // } }
使用外部“C”{}aslo包装头 一切都编译得很好,创建了一个.so文件并复制到我的项目下的libs文件夹中,但是当我在Eclipse中调试和运行时,我不断收到一条日志cat消息,“没有找到本机的实现…”。由于所有NDK示例都是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函数,则可能
谢谢。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级别
您是否使用
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文件中的方法中指定活动名称?