NDK .so Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方案_ndk java.lang.unsatisfiedlinkerror: no implementat-程序员宅基地

技术标签: ndk报错  jni  jni命名  No implementation fo  开发遇到的坑  

抛异常:

NDK c源码

#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_example_fanenqian_ndk1_NDKtest_getString(JNIEnv *env, jclass type) {
    return (*env)->NewStringUTF(env, "this is NDK application");
}

JNI方法
public class NDKtest {
    public static native String getString();
    static {
        System.loadLibrary("ndk_mode");
    }
}



很明显提示没有这个方法的实现
出现这个异常的原因是NDKtest类的包名一定要是com.example.fanenqian.ndk1,原因是JNI接口Java_com_example_fanenqian_ndk1_NDKtest_getString中,com_example_fanenqian_ndk1代表的是package name,NDKtest则是class name。所以该NDKtest包名必须是com_example_fanenqian_ndk1,类名是NDKtest,也就是说,我们.so中函数声明涉及到的package name和class name与调用它的package name和class name不符。因此我们要改变我们工程中的package name和class name。使其与.so文件中函数签名提示的一致,在这个类中加入native方法的声明。


JNI的命名规则

这里顺便说一下JNI的命名规则,对于传统的JNI编程来说,JNI方法跟Java类方法的名称之间有一定的对应关系,要遵循一定的命名规则,如下所示:

前缀: Java_
类的全限定名,用下划线进行分隔(_):com_oyp_jni_JniTest
方法名:getTestString
JNI函数指定第一个参数: JNIEnv *
JNI函数指定第二个参数: jobject
实际Java参数: jstring, jint ….
所以对于在Java类 com.oyp.jni.JniTest类的一个方法:
public native String getTestString (String oyp);
其对应的jni层的方法如下:
jstring Java_com_oyp_jni_JniTest_getTestString(JNIEnv * e, jobject clazz, jstring oyp);
如果不这样命名,当把动态库加载进DVM的时候,通过JNIEnv *指针去查找Java Native方法对应的JNI方法的时候,就会找不到了。 
注意,我们也可以利用函数注册的方法,将Java层的方法名跟JNI层的方法名的对应关系保存起来,注册到DVM中,就不需要这样的命名规范了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fanenqian/article/details/77989238

智能推荐

ubuntu18.04下qt5.9编译错误: -1: error: cannot find -lGL_:-1: error: /usr/local/qt-5.9/lib/libqt5core.so: u-程序员宅基地

文章浏览阅读2.1k次。只要安装libGL即可:sudo apt-get install libqt4-devsudo apt update再重新编译就ok啦 _:-1: error: /usr/local/qt-5.9/lib/libqt5core.so: undefined reference to `uca

如何绘制深度神经网络图_深度学习神经网络图怎么画-程序员宅基地

文章浏览阅读2.7k次,点赞4次,收藏22次。1.在线版本的NN-SVG_深度学习神经网络图怎么画

菜鸟学习Android笔记-20140311_textview3:[i18n] hardcoded string-程序员宅基地

文章浏览阅读771次。1、编写布局文件时,遇到这样的警告,“[I18N] Hardcoded string "昵称:", should use @string resource” 原来的代码:

不同参数统计运行时间 large_integer c语言,使用LARGE_INTEGER查看系统运行时间-程序员宅基地

文章浏览阅读252次。众所周知,windows ce是一个实时操作,因此提供了不少的优先级给用户.优先级最高为0级,也就是说使用0优先级的程序, 可以挂起整个系统, 来运行你的程序对于实时性比较的领域, 我们作为程序员的 应该清楚的知道你的程序模块运行的时间 是非常必要的. 当然这个模块运行的时间也不是完全的稳定的, 几次运行的时间相差几十毫秒是很正常的. 因此我们只要知道大概的时间就可以了.当然, 大家..._large_integer计算时间

ssh登陆服务器locale告警(-bash: warning: setlocale:)的处理方法-程序员宅基地

文章浏览阅读1.9k次。 使用ssh远程登陆 IDC机房服务器,发现老是出现如下告警信息:-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory-bash: warning: setlocale: LC_COLLATE: cannot change locale (en_U..._bash: warning: setlocale: lc_ctype: cannot change locale (en_us.utf-8): no s

Android Rxbus事件总线_rxbus.post-程序员宅基地

文章浏览阅读3.7k次。我的视频课程:《FFmpeg打造Android万能音频播放器》 最近在项目中使用了Rxjava和RxAndroid,确实感觉挺不错的,然后听说可以用RxBus来替换掉EventBus等事件分发的三方库,然后就上午找比较好的RxBus开源项目(以为是有统一标准的),然而后面才知道,RxBus没有绝对的,只是一种想法而已,借助Rxjava的特性来实现的。既然这样,我也就自己实现了一个(可..._rxbus.post

随便推点

创建登录界面_建网站登录页面-程序员宅基地

文章浏览阅读334次。package zhoushi;import javax.swing.*;//调用库import java.awt.*;import java.awt.event.*;public class jh extends JFrame implements ActionListener{//创建类jh继承JFrame,实现接口ActionListener JPanel log;//定义变量_建网站登录页面

win10安装linux虚拟机并配置shell工具连接_shell确认虚拟机光盘连接-程序员宅基地

文章浏览阅读1k次。1:虚拟机安装先看怎么用VMware安装一个虚拟机,全部放图,一步步来。主要还是以防以后我自己忘记怎么搞了,老了,记性不好了。VMware就在网上随便下载一个了,镜像我会在下面放上我的或者大家也可以自己去网上下一个。第一步:新建虚拟机第二步:选择类型第三步:选择映像文件,一般都会检测到,检测不到就只能自己打开浏览去找吧!第四步:给虚拟机命名,可以更改虚拟机安装位置。反正我是不会装在系统盘的,这辈子都不会的o(´^`)o第五步:默认选择是虚拟磁盘拆分成多个文件,但._shell确认虚拟机光盘连接

计算机视觉模型常用评价指标_平均交并比-程序员宅基地

文章浏览阅读3.6k次,点赞9次,收藏36次。分类任务常用准确率、精确率、召回率、F1_scores、ROC曲线等指标来评价模型的优劣,当然这些基础指标也可以用来评价分割模型或检测模型,它们基本上是可以通用的。混淆矩阵是对分类问题预测结果的总结,也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。混淆矩阵中含有4个分类问题的基础指标,如下表所示。........._平均交并比

提高安全投资回报:威胁建模和OPEN FAIR风险分析-程序员宅基地

文章浏览阅读1.1k次,点赞6次,收藏8次。我们可以从当前的现实,即组织盲目地将资源投入到建议和合规法规中,而不评估预期收益,转向新的现实,即他们批判性地思考组织需要什么,以便以正确的成本获得足够的安全性。根据威胁建模的建议,通过利用Open FAIR流程来分析不同控制组合的影响,组织可以有效地确定哪组控制对降低系统的风险最有效。更重要的是,组织可以通过考虑风险的总体降低以及实施这些控制的成本来决定给定系统的最佳控制集。安全被视为“做生意的成本”。威胁建模是一个过程,可以帮助您了解特定系统的安全威胁,确定这些威胁的潜在损失,并建立适当的缓解措施。

【Android】Android中 Paint 字体 粗细等属性的一些设置_android java paint画字字体粗-程序员宅基地

文章浏览阅读2.3k次。【Android】Android中 Paint 字体 粗细等属性的一些设置_android java paint画字字体粗

机器人的振动控制问题_医疗机器人残余振动产生的原因-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏41次。当机器人控制系统的设计将关节柔性忽略时,也许电机的运动位置能够被较为精确的控制,然而在加速度很高的情况下,大传动力会导致机器人的连杆位置与电机位置出现较大偏差,同时在运动结束时机器人连杆将在其平衡位置附近进行较长时间的振动。方案1:基于反馈的振动控制如果我们可以较为精确的同时测量机器人电机与连杆的位置甚至速度,那么便有可能通过机器人连杆轨迹与参考运动轨迹的偏差来调整电机的控制力矩,从而实现对机器人连杆位置的精确控制来消除由于弹性变形导致的振动。这种反馈控制问题可以通过例如Integrator Bac.._医疗机器人残余振动产生的原因