第一步:静态代码块 导入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----------动态注册相关推荐

  1. Android之JNI动态注册native方法和JNI数据简单使用

    1.爆结果照片 2.介绍JNI注册方式 JVM 查找 native 方法有两种方式:     1).按照 JNI 规范的命名规则(静态注册)    2) .调用 JNI 提供的 RegisterNat ...

  2. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )

    文章目录 I . 动态注册流程 ( 总结 ) II . JNI_OnLoad 方法 III . 被注册的本地 C/C++ 方法参数 IV . JNINativeMethod 结构体 ( 核心重点 ) ...

  3. Android 实现JNI动态注册

    Android 实现JNI的动态注册 前景 什么是静态注册 静态注册的优缺点 优点 缺点 什么是动态注册 实现 创建步骤 用到的方法 结束 前景 JNI可以说是Java 和Native 的桥梁 起承上 ...

  4. 安卓逆向_15( 三 ) --- Android NDK 开发【 jni 静态注册、JNI_OnLoad 动态注册】

    Android Studio开发JNI示例:https://blog.csdn.net/wzhseu/article/details/79683045 JNI_动态注册_静态注册.zip : http ...

  5. 2020年最新前端学习路线

    这段日子在 B 站上收到小伙伴最多的要求就是出一个前端学习路线,我能够充分的感受到大家抓耳挠腮加挠墙的迷茫~所以在这里给大家总结了一套前端学习路线.先从初级前端工程师所需的技能开始,然后一路升级到高级 ...

  6. java 动态加载jni_JNI静态注册与动态注册详解

    JNI注册,是指将java层方法(native关键字修饰的)和C层方法对应起来,以实现java层代码调用c层代码的目的.JNI注册分为静态注册和动态注册两种,静态注册是通过固定格式方法名进行关联,动态 ...

  7. 想成为前端大神秒杀群雄?收下这份2020年最新前端学习路线!

    B 站视频版:点击传送 是不是梦想了好久,成为叱诧风云,挥手成页面的前端大神?那你来对地方了,这篇文章整理了成为前端大神的必备技能.先从初级前端工程师所需的技能开始,然后一路升级到高级工程师该掌握的技 ...

  8. android手机解锁成功后的广播,Android动态注册锁屏、解锁、开屏系统广播

    先自定义一个广播类 public class ScreenBroadcastReceiver extends BroadcastReceiver { private final static Stri ...

  9. 【我的C语言学习进阶之旅】介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册

    目录 一.要介绍本篇博客的原因 二.静态注册 2.1 实现原理 2.2 实现过程 2.3 弊端 2.4 示例 三.动态注册 3.1 实现原理 3.2 实现过程 3.3 优点 3.4 示例 一.要介绍本 ...

  10. Android-NDK 动态注册与JNI线程

    文章目录 1.动态注册相比于静态注册的优点 2.JNI_OnLoad方法 3.动态注册的流程 3.1编写需要动态注册的方法 3.2增加结构体数组 3.3编写JNI_OnLoad方法 4.JNI中子线程 ...

最新文章

  1. C语言中函数的参数列表为空和void的区别
  2. T-SQL查询进阶--流程控制语句
  3. 从源码角度深入分析ant
  4. 1810: Huffuman树(vector模拟)
  5. 通过OWA修改密码,提示输入的密码不符合最低安全要求
  6. GCC 链接时出现undefined reference to “...”时可能解决办法
  7. 数据科学与大数据排名思考题_排名前5位的数据科学课程
  8. Chapter 1 First Sight——30
  9. 前端学习(3060):vue+element今日头条管理-处理展示文章封面
  10. python怎么导入apscheduler,如何强制apscheduler将作业添加到作业存储?
  11. JEECG 前端JS国际化实现,采用i18n新技术方案
  12. 信息学奥赛一本通 1006:A+B问题 | OpenJudge NOI 1.3 01
  13. Linux namespace - Docker 背后的故事
  14. python数据分析与人工智能_Python数据分析:seaborn
  15. 【报告分享】2020金融兴趣人群内容消费及理财意识洞察报告.pdf(附下载链接)...
  16. docker 部署rabbitmq,k8s部署rabbitmq集群,跟踪和监控rabbitmq
  17. 软考中级——数据库系统工程师
  18. 总结:几个分布式系统架构设计原理
  19. 微信小程序开发常用代码
  20. VC6.0下配置opengl

热门文章

  1. .netcore2.2 windows发布IIS 服务器配置 0x8007000d
  2. java 中文星期表示_java之获得中文星期几
  3. JavaScript数组反转教程
  4. VS加载DLL报---找不到指定的模块(126)
  5. 作为一名程序员,我都收集了哪些好玩的生成器?
  6. Android 神器Tasker使用
  7. 模拟题【枚举计数】咒语
  8. office 2019 word鼠标点击反应慢要等一下
  9. 笔记本电脑亮度突然不能调的处理方法
  10. php 逻辑思维题,倘若3分钟内,你能答对这道智力题,说明你的逻辑思维能力很强...