简介
成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。
一直以来,对JNI和NDK这块并没有进行比较系统的学习,今天,打算循序渐进,把JNI和NDK这块的知识来全面的学习一下。
JNI
(what)定义:java native interface(即java本地接口)
作用:使java与本地类型语言(如C、C++)交互
(why)在某些情况下,java需要与本地类型语言进行交互,但是由于java具备跨本台的特点,所以与本地类型语言的交互能力比较弱,所以使用JNI来增强与本地类型语言的交互能力
(how)详情见Android Studio实现NDK部分
NDK
(what)定义:native development kit(即本地开发工具包)
作用:快速开发C、C++的动态库,并自动把so和应用打包成apk,其就是一种在Android中使用jni与本地类型语言(如C、C++)交互的方式
特点:
1、性能方面:
1、运行效率高
在开发高性能的需求中,采用C、C++更有效率,本地代码(C、C++)执行算法的效率更高
2、代码安全性高
java是半解释性语言,容易被反汇编后得到源代码,而本地有些代码(C、C++)则不会,提高代码的安全性
2、功能方面:
1、功能扩展性强
能够使用其它语言的开源库
3、使用方面:
1、代码可复用及移植
使用本地语言(C、C++)开发的代码还可应用于其它支持该语言的平台
4、其它方面:
1、NDK提供的库有限,仅用于处理算法和敏感问题
2、提供了交叉编译器,用于生产特定平台的CPU动态库
(why)方便在Android中使用JNI与本地语言进行交互。
(how)详情见Android Studio实现NDK部分
JNI与NDK的关系
1、JNI是实现的目的,而NDK是在Android中实现JNI的手段,即在Android开发环境中,通过NDK实现JNI的功能。
2、NDK提供了把.so文件和应用打包成apk的工具,而JNI没有,它只是把.so文件放在文件系统的特定位置。
Android Studio实现NDK
一、Android Studio2.2之前实现NDK
1、配置NDK开发环境
1、下载Android NDK工具包
2、解压NDK包
3、安装&配置NDK包
2、关联Android Studio项目与NDK
1、在Gradle的本地local.properties中添加配置
ndk.dir=/Users/JsonChao/Library/Android/sdk/ndk-bundle
2、在Gradle的gradle.properties中添加配置
// 对旧版本的NDK支持
android.useDeprecatedNdk=true
在app的build.gradle的defaultConfig中添加ndk节点
添加对应的moduleName(.so文件名)或者其它需要的功能
3、创建本地代码文件
如果本地代码时C、C++,那么需要使用extern “C”{}把代码包进去
JNIEXPORT、jstring、JNICALL中的JNIEXPORT、JNICALL不能省略
关于方法名构成:
Java_包名_类名_方法名(Java首字母需要大写)
包名中的.变_,_变_1
新建src/main/jni,放入xxx.cpp文件
java与JNI数据类型对应的关系:
八大基本数据类型int->jint(前面直接加j)
void不变
Objec、class、String、Throwable->jobject(前面加j,第二个字母小写)
八大基本数据类型和Objec、class、String数组化
Object[]->jobjectArray(前面加j,第二个字母小写,[]数组符号变英文Array)
4、创建Android.mk文件
作用:指定源码编译的配置信息
如工作目录、编译的模块的名称、编译的文件等等
放入src/main/jni中
5、创建Application.mk文件
作用:配置编译平台相关内容
APP_ABI:armeabi(Android平台主要是使用armeabi)
放入src/main/jni中
6、进入src/main/jni中,使用ndk-build命令编译生成.so文件,成功后,生成libs&obj文件夹,.so文件在libs的armeabi文件夹中
7、在新建的src/main/jniLibs文件夹中放入armeabi文件夹
8、加入如下代码,在Android Studio中使用NDK实现jni功能
//加载.so文件
{
System.loadLibrary("hello_jni");
}
//映射的本地方法
public native String getFromJni();
二、Android Studio2.2之后实现NDK
Android Studio内部已经集成了NDK,所有只需在Android Studio内部配置即可。
1、创建工程选择NDK选项,根据提示完成配置
2、AS会直接生成C++代码,根据需求修改即可使用。
赞赏
如果这个库对您有很大帮助,您愿意支持这个项目的进一步开发和这个项目的持续维护。你可以扫描下面的二维码,让我喝一杯咖啡或啤酒。非常感谢您的捐赠。谢谢!
Contanct Me
● 微信:
欢迎关注我的微信:
bcce5360
● 微信群:
微信群如果不能扫码加入,麻烦大家想进微信群的朋友们,加我微信拉你进群。
● QQ群:
2千人QQ群,Awesome-Android学习交流群,QQ群号:959936182, 欢迎大家加入~
About me
Email: chao.qu521@gmail.com
Blog: https://jsonchao.github.io/
掘金: https://juejin.im/user/5a3ba9375188252bca050ade