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文件