安卓 JNI 开发指南
1 JNI 介绍
JNI 的全称是 Java Native Interface,即 Java 本地接口,用一句话来说就是JNI 是属于Java的,尽管我们是在安卓上使用,但是和安卓没有直接关系。我们只是通过 JNI 来在Java代码里面调用C或者C++的代码。如下图所示:
通过上面的图我们可以发现java不仅可以通过jni来调用c/c++,反过来 c/c++也可以来调用 java 的一些程序,所以,JNI 让 java 和 c/c++有了交互的功能。
既然我们可以通过 JNI 在 Java 代码里面调用 C 或者 C++,那么我们就可以通过安卓应用来控制底层硬件了,比如说打开 LED,关闭 LED 的操作。
生成 so 库我们有俩种方法, 第一种是使用 CMake , CMake 是跨平台编译工具, 要配合CMakeList.txt 和 gradle 来使用。 第二种是使用 NDK 自带的脚本工具 ndk-build 配合 Android.mk 来使用。这里我只介绍第一种方法, 使用 ndk-build 的方法现在不是太常用了。
2 实验一:新建JNI工程
2.1实验步骤
- 实验环境采用的是Android Studio作为软件编写IDE。
- 下载CMake编译工具。
可以通过 AndroidStudio->SDK->SDK Tools->-CMake 来下载。如果在安装
AndroidStudio 的时候已经安装了,则不必再次安装,如下图所示:
- 建一个 Native c++ 项目。
打开 AndroidStudio,选择新建一个项目,如下图所示:
然后选择 Native c++,并点击下一步,如下图所示:
这里我们把工程名字设置成 JniTest,保存路径设置成 G:\adnroid\PRO\JNI(大家依据自己的电脑选择路径即可,路径不要有中文),语言设置为 Java ,其他保持不变, 然后点击下一步。 如下图所示:
C++标准这里我们选择 C++11, 然后点击下一步, 如下图所示:
稍等片刻, 编译完成如下图所示:
我们新创建的这个工程会给我们自动创建一个 jni 的例子,我们来一起分析下这个例子,然后在来仿写我们自己的jni,先学会爬,然后在学会跑,打开MainActivity, 如下图所示:
在这个文件里面我们定义了一个stringFromJNI()函数,并且我们调用了 native-lib 库, 如下图所示:
然后我们打开 src/main/cpp/native-lib.cpp 这个cpp文件,native-lib 就是这个文件编译得到的,如下图所示:
然后之前我们已经提到了,使用 CMake 编译 so 库,需要配CMakeList.txt 和 gradle 来使用,那我们来看一下我们创建的这个工程有没有这俩个文件,如下图所示:
我们点击一下编译,如下图所示:
2.2实验现象
我们将程序运行到开发板上,可以看见顺利调用了C++的打印,并在屏幕上显示 Hello from C++。
如果我们需要把我们这个JNI封装好的函数给到别的项目调用时,则需要.so文件,带领大家寻找下.so文件,我们切换到 project。