NDK
(Native Development Kit),原生开发工具包是一组可以在Android应用中利用C和c++代码的工具,可用以从源代码构建或利用现有的预构建库。
JNI
(Java Native Interface),通过使用 JAVA本地接口书写程序,可以确保代码在不同的平台上方便移植。JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
Android系统按语言来划分的话由两个世界组成,分别是Java世界和Native世界。那为什么要这么划分呢?Android系统由Java写不好吗?除了性能的之外,最主要的原因就是在Java诞生之前,就有很多程序和库都是由Native语言写的,因此,重复利用这些Native语言编写的库是十分必要的,况且Native语言编写的库具有更好的性能。
这样就产生了一个问题,Java世界的代码要怎么使用Native世界的代码呢,这就需要一个桥梁来将它们连接在一起,而JNI就是这个桥梁。
在Android开发中,由于种种原因需要调用C/C++代码, 这个时候就要用到JNI(Java Native Interface)了, 在调用JNI相关方法之前, 要对java中native关键字定义的方法进行注册, 注册方式有两种: 静态注册和动态注册, 两者优缺点如下:
静态注册
优点: 理解和使用方式简单, 属于傻瓜式操作, 使用相关工具按流程操作就行, 出错率低
缺点: 当需要更改类名,包名或者方法时, 需要按照之前方法重新生成头文件, 灵活性不高
动态注册
优点: 灵活性高, 更改类名,包名或方法时, 只需对更改模块进行少量修改, 效率高
缺点: 对新手来说稍微有点难理解, 同时会由于搞错签名, 方法, 导致注册失败
静态注册详细步骤:
1.在Android工程中的JAVA代码中编写被native修饰的方法.
例如:
2.将native方法所在的类生成.h头文件. CMD命令: javah -jni 完整类名 (注意java类的文件路径).
例如:
注意:生成头文件以后将它单独放在一个文件夹中方便查阅修改,一般新建一个名字为jni的目录存放.c和.h文件.
3.新建.h文件并编写C/C++代码实现里面的接口. 注意:编写C/C++代码时要遵循JNI的规则. 具体规则请查看原版JNI文件,本文附件中有.
4.编写配置文件: Android.mk , application.mk保存到和C代码文件的同目录中,注意正确修改模块名称以及源.c文件名.
5.使用CMD命令: ndk-build生成.so文件 注意:使用命令时候如果没有配置系统环境请在.c文件的目录下执行.
6.在java代码中加载模块名称.
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191205135240445.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lKSllYTQ==,size_16,color_FFFFFF,t_70)
至此,静态注册完毕.
本文主要介绍了从JAVA层到Native层通过JNI静态注册的方法实现了C代码中的字段传输. 那么还有从Native层到JAVA层通过JNI静态注册的方法实现JAVA代码中的字段以及函数呢,这里由于字数限制原因,就不做过多赘述,详细代码已经附在下面文件中.
下面是演示效果:
需要学习安卓逆向可以联系1847076032