JNI是Android应用开发中不太常涉及的技术,但在Framework层中却被广泛使用。作为一名Android应用开发人员,学习JNI知识,对理解整个系统原理还是有很大帮助的。
学习JNI有很多途径:
- 可以直接阅读Framework源码。这种方案不太好上手验证,因为Framework代码要配置的编译环境还是比较复杂的,而且编译后没法直接运行测试,需要Root系统
- 其次也可以下载安装NDK,直接在Android Studio里开发项目。这种方式也有比较多的环境配置工作,并且操作起来比较麻烦。
因此这篇文章探讨的主题就是在最小环境下,进行JNI的学习与验证。JNI是Java本身就具备的能力,所以最小环境就是Java运行的环境,不需要任何Android开发工具以及IDE。
为了方便调试与编译,这里我使用Ubuntu系统,需要安装的开发工具有:
- openjdk:这里采用的是openjdk11版本
- gcc:通过
apt-get install build-essential
安装 - 任意一个文本编辑器
JNI Hello World
在这个JNI例子中,主要做这几件事:
- Java中调用JNI函数
- JNI中打印Java中的变量
- 在JNI中修改Java中变量
- 在JNI中调用Java方法
编写Java代码
Java层的代码很简单,声明一个String变量,供native代码读写。同时提供一个打印变量的方法
public class JniStudy {
private String msg = "Hello World from Java";
private native void nativeChangeMsg();
public native void nativeCallPrintMsg();
public void getNativeMsg() {
nativeChangeMsg();
}
public void printMsg() {
System.out.println(this.msg);
}
public static void main(String[] args) {
JniStudy test = new JniStudy();
test.getNativeMsg(); // 调用native方法更改msg内容
test.printMsg();
System.out.println("####################");
test.nativeCallPrintMsg(); // 调用native方法,native再反向调用printMsg方法