Android:JNI 与 NDK到底是什么
经常看到JNI和NDK,两者都是经常和C打交道,但是二者什么区别不是很懂,在CSDN上看到一个整理很好的,所以拿来学习学习
JNI
简介
-
定义: Java Native Interface,即Java 本地接口
-
作用:使得Java与本地其他类型语言(如C,C++)交互
说白了就是Java代码里调用C,C++等语言的代码或C,C++代码调用Java代码
注意事项
1.JNI是Java调用Native语言的一种特性
2.JNI是属于Java的,与Android 无直接关系
为什么要用JNI
-
背景:实际使用中,Java需要与本地代码进行交互
-
问题:因为Java具备快跨平台的特点,所以Java与本地代码交互的能力非常弱
-
解决方案: 采用 JNI特性 增强 Java 与 本地代码交互的能力
实现步骤
1.在Java中声明Native 方法(即需要调用本地方法)
2.编译上述Java源文件javac(得到.class文件)
3.通过javah命令导出JNI的头文件(.h文件)
4.使用Java需要交互的本地代码实现在Java中声明的Native方法
如 Java 需要与 C++ 交互,那么就用C++实现 Java的Native方法
5.编译.so库文件
6.通过Java命令执行 Java程序,最终实现Java调用本地代码
NDK
简介
- 定义:Native Development kit,是Android的一个工具开发包
NDK是属于Android 的,与Java并无直接关系 - 作用:快速开发C,C++的动态库,并自动将so和应用一起打包成APK,
即可通过NDK在Android 中使用JNI与本地代码交互 - 应用场景:在Android的场景下 使用JNI
即 Android开发的功能需要本地代码(C/C++)实现
image.png
注意
使用步骤
-
配置 Android NDK环境
-
创建 Android 项目,并与 NDK进行关联
-
在 Android 项目中声明所需要调用的 Native方法
-
使用 Android需要交互的本地代码 实现在Android中声明的Native方法
比如 Android 需要与 C++ 交互,那么就用C++ 实现 Java的Native方法
通过 ndk - bulid 命令编译产生.so库文件
编译 Android Studio 工程,从而实现 Android 调用本地代码两者的关系
具体细节:原作者 https://blog.csdn.net/carson_ho/article/details/73250163