JNI 基础
一、JNI 涉及的名词概念
1.1、 JNI:Java Native Interface
- 它是
Java平台的一个特性(并不是Android系统特有的)。实现Java代码调用C/C++的代码,C/C++的代码也可以调用Java的代码.
1.2、 二进制库分类 : 静态库,动态库.
- 静态库
| 系统 | 静态库文件 |
|---|---|
| Windows | .lib |
| Linux | .a |
| MacOS/IOS | .a |
.a静态库就是好多个.o合并到一块的集合,经常在编译C库的时候会看到很多.o,这个.o就是目标文件 由.c + .h编译出来的。.c相当于.java,.h是C库对外开放的接口声明。对外开放的接口.h和.c需要一一对应,如果没有一一对应,外部模块调用了接口,编译的时候会提示找不到方法。
.a存在的意义可以看成Android aar存在的意义,方便代码不用重复编译, 最终为了生成.so (apk)
- 动态库
| 系统 | 动态库文件 |
|---|---|
| Windows | .dll |
| Linux | .so |
| MacOS/IOS | .dylib |
动态库 ,在
Android环境下就是.so,可以直接被java代码调用的库.
1.3、 CPU 架构(ABI):armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64
各个平台架构的区别就是指令集不一样,浮点运算能力不一样,按照上面排列的顺序,浮点运算能力运行从低到高。
-
armeabi:这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈 (微信) armeabi-v7a:ARM v7目前主流版本,兼容armeabi (facebook app)-
arm64-v8a:64位支持 兼容armeabi-v7a armeabi -
mips/mips64: 极少用于手机可以忽略 -
x86/x86_64:x86架构一般用于TV电视机 ,兼容armeabi - 建议
android apk为了减少包体大小只接入armeabi-v7a即可
1.4、 Android 特有的文件 :Android.mk Application.mk
Android.mk:在 Android 上编译需要的配置文件,相当于 build.gradle,详细细节后面会讲到。
Application.mk:上代码
APP_PLATFORM := android-14 //指定 android 系统
APP_ABI := armeabi-v7a // 指定生成哪个架构的 so
1.5、 NDK :Android 平台上用来编译 C/C++库的工具
二、JNI 在 Android Studio 搭建
(1)调用了System.loadLibrary("helloworld");这句代码代表着,使用这个类之前都会去加载libhelloworld.so 这个动态库。
(2)public native String nativeGetString()//或者external fun stringFromJNI(): String这个方法的实现在 c 层。所以接下来我们要构建 c 层的代码。
(3) 自动生成一个 helloworld_android.c文件