2020年最新as中jni----------动态注册
第一步:静态代码块 导入so库
static {System.loadLibrary("native-lib"); //native-lib是so名,可随意更改
}
第二步:写外部函数
public native String getString(); //native代表c\c++实现
第三步:创建新的 C/C++ 源代码文件
要将新的 C/C++ 源代码文件添加到现有项目,请按以下步骤操作:如果您的应用的主源代码文件集内还没有 cpp/ 目录,请按如下所示的方法创建一个:
从 IDE 的左侧打开 Project 窗格,然后从下拉菜单中选择 Project 视图。
转到 your-module > src,右键点击 main 目录,然后依次选择 New > Directory。
输入 cpp 作为目录名称,然后点击 OK。
右键点击 cpp/ 目录,然后依次选择 New > C/C++ Source File。
为您的源代码文件输入一个名称,例如 native-lib。
从 Type 下拉菜单中,为您的源代码文件选择文件扩展名,例如 .cpp。
您可以向此下拉菜单添加其他文件类型(例如 .cxx 或 .hxx),只需点击 Edit File Types 图标 即可。在弹出的 C/C++ 对话框中,从 Source Extension 和 Header Extension 下拉菜单中选择另一个文件扩展名,然后点击 OK。
如果您还想要创建头文件,请选中 Create an associated header 复选框。
点击 OK。
第四步:定义一个JNINativeMethod数组
typedef struct {const char* name; //函数名const char* signature; //参数和返回值 格式是()V,括号里面是参数,后边是返回值void* fnPtr;
} JNINativeMethod;
第五步: 加载并注册jni
函数均为c++中的函数,如果是c语言需要调用c的函数(函数的返回值就是c的函数),
获得class函数:jclass FindClass(const char* name) //name是class的路径和名称
{ return functions->FindClass(this, name); }用到的函数:加载jni函数JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);获得env函数:jint GetEnv(void** env, jint version) //jni版本一般使用JNI_VERSION_1_4
{ return functions->GetEnv(this, env, version); }注册env函数:jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,jint nMethods)
{ return functions->RegisterNatives(this, clazz, methods, nMethods); }
完整动态注册代码:
jint getInt(JNIEnv *env, jobject, jint n)
{int m=n;return ++m;
}
void getStaticMode(JNIEnv *env, jobject)
{jclass clazz= env->FindClass("com/example/myapplication/MainActivity");jmethodID methodID=env->GetStaticMethodID(clazz, "staticMothod", "()V");env-> CallStaticVoidMethod( clazz, methodID);return;
}
JNINativeMethod nativeMethod[]={{"getString","()Ljava/lang/String;",(void*)getString}};JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{JNIEnv* env;if(vm->GetEnv((void**)(&env), JNI_VERSION_1_4) != JNI_OK){return JNI_ERR;}jclass clazz= env->FindClass("com/example/myapplication/MainActivity");if(env->RegisterNatives(clazz,nativeMethod,sizeof(nativeMethod)/sizeof(JNINativeMethod))!=JNI_OK)
{return JNI_ERR;
}
return JNI_VERSION_1_4;
}
第六步:配置CMake
此处和静态注册处理相同
动态注册和静态注册的区别:
静态注册
编写不方便,jni方法名字必须遵循规则而且名字很长过程较多程序运行的效率极低,不安全java_开头
动态注册
流程清晰可控效率更高,安全
2020年最新as中jni----------动态注册相关推荐
- Android之JNI动态注册native方法和JNI数据简单使用
1.爆结果照片 2.介绍JNI注册方式 JVM 查找 native 方法有两种方式: 1).按照 JNI 规范的命名规则(静态注册) 2) .调用 JNI 提供的 RegisterNat ...
- 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )
文章目录 I . 动态注册流程 ( 总结 ) II . JNI_OnLoad 方法 III . 被注册的本地 C/C++ 方法参数 IV . JNINativeMethod 结构体 ( 核心重点 ) ...
- Android 实现JNI动态注册
Android 实现JNI的动态注册 前景 什么是静态注册 静态注册的优缺点 优点 缺点 什么是动态注册 实现 创建步骤 用到的方法 结束 前景 JNI可以说是Java 和Native 的桥梁 起承上 ...
- 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】
Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...
- 2020年最新前端学习路线
这段日子在 B 站上收到小伙伴最多的要求就是出一个前端学习路线,我能够充分的感受到大家抓耳挠腮加挠墙的迷茫~所以在这里给大家总结了一套前端学习路线.先从初级前端工程师所需的技能开始,然后一路升级到高级 ...
- java 动态加载jni_JNI静态注册与动态注册详解
JNI注册,是指将java层方法(native关键字修饰的)和C层方法对应起来,以实现java层代码调用c层代码的目的.JNI注册分为静态注册和动态注册两种,静态注册是通过固定格式方法名进行关联,动态 ...
- 想成为前端大神秒杀群雄?收下这份2020年最新前端学习路线!
B 站视频版:点击传送 是不是梦想了好久,成为叱诧风云,挥手成页面的前端大神?那你来对地方了,这篇文章整理了成为前端大神的必备技能.先从初级前端工程师所需的技能开始,然后一路升级到高级工程师该掌握的技 ...
- android手机解锁成功后的广播,Android动态注册锁屏、解锁、开屏系统广播
先自定义一个广播类 public class ScreenBroadcastReceiver extends BroadcastReceiver { private final static Stri ...
- 【我的C语言学习进阶之旅】介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册
目录 一.要介绍本篇博客的原因 二.静态注册 2.1 实现原理 2.2 实现过程 2.3 弊端 2.4 示例 三.动态注册 3.1 实现原理 3.2 实现过程 3.3 优点 3.4 示例 一.要介绍本 ...
- Android-NDK 动态注册与JNI线程
文章目录 1.动态注册相比于静态注册的优点 2.JNI_OnLoad方法 3.动态注册的流程 3.1编写需要动态注册的方法 3.2增加结构体数组 3.3编写JNI_OnLoad方法 4.JNI中子线程 ...
最新文章
- C语言中函数的参数列表为空和void的区别
- T-SQL查询进阶--流程控制语句
- 从源码角度深入分析ant
- 1810: Huffuman树(vector模拟)
- 通过OWA修改密码,提示输入的密码不符合最低安全要求
- GCC 链接时出现undefined reference to “...”时可能解决办法
- 数据科学与大数据排名思考题_排名前5位的数据科学课程
- Chapter 1 First Sight——30
- 前端学习(3060):vue+element今日头条管理-处理展示文章封面
- python怎么导入apscheduler,如何强制apscheduler将作业添加到作业存储?
- JEECG 前端JS国际化实现,采用i18n新技术方案
- 信息学奥赛一本通 1006:A+B问题 | OpenJudge NOI 1.3 01
- Linux namespace - Docker 背后的故事
- python数据分析与人工智能_Python数据分析:seaborn
- 【报告分享】2020金融兴趣人群内容消费及理财意识洞察报告.pdf(附下载链接)...
- docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq
- 软考中级——数据库系统工程师
- 总结:几个分布式系统架构设计原理
- 微信小程序开发常用代码
- VC6.0下配置opengl
热门文章
- .netcore2.2 windows发布IIS 服务器配置 0x8007000d
- java 中文星期表示_java之获得中文星期几
- JavaScript数组反转教程
- VS加载DLL报---找不到指定的模块(126)
- 作为一名程序员,我都收集了哪些好玩的生成器?
- Android 神器Tasker使用
- 模拟题【枚举计数】咒语
- office 2019 word鼠标点击反应慢要等一下
- 笔记本电脑亮度突然不能调的处理方法
- php 逻辑思维题,倘若3分钟内,你能答对这道智力题,说明你的逻辑思维能力很强...