JNI
Java Native Interface
,即 Java本地接口。JNI 是属于Java的,与Android无直接关系
作用
Java代码和 C、C++ 互相调用
NDK
Native Development Kit
,是 Android的一个工具开发包。NDK是属于 Android 的,与Java并无直接关系
。
作用
通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互
NDK项目构建
新建工程,按图选择,然后点Next–>Finish即可
项目目录结构
项目目录如图所示
这些都是AS自动帮我们生成的。仔细观察可以看出来.cpp文件生成的native方法名对应Java_包名_原生的方法名。修改native hello字段"Hello from C++"运行可以看到App上显示的就是我们修改的结果。
参数意义
- JNIEnv* 是定义任意 native 函数的第一个参数,它是一个指针,通过它可以访问虚拟机内部的各种数据结构,同时它还指向 JVM 函数表的指针,函数表中的每一个入口指向一个 JNI 函数,每个函数用于访问 JVM 中特定的数据结构。
通过它可以访问到 Java 虚拟机内部的各种对象。
- jobject 是 native 函数里的第二个参数类型,但却不是一定的。如果该 native 方法是一个静态 static 方法,那么第二个参数就是 jobject 类型,指的是调用该函数的对象;
如果是一个实例方法,那么第二个参数就是 jclass 类型,指的是调用该函数的类。
可以打开app目录下的build.gradle文件看下和普通Android项目的差别
注意箭头位置表示的是CMake的版本,系统默认是3.10.2。这个需要替换成3.6.0,因为我试的3.10.2版本日志打印会有问题。在CMakeLists.txt
文件加把最低兼容版本cmake_minimum_required
也改一下3.4.1。
CMakeLists
cmake的配置文件,是 CMake 编译系统中软件包的输入。描述如何编译代码、安装。
常用命令
cmake 的最小版本号
cmake_minimum_required(VERSION 3.10.2)
设置项目名称
project("myapplication")
添加依赖
add_library(
# 设置库的名称。
myapplication
# SHARED动态库. STATIC 静态库
SHARED
# 提供源文件的相对路径
native-lib.cpp)
搜索系统库依赖
find_library(
# Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
关联依赖
target_link_libraries( # Specifies the target library.
myapplication
# Links the target library to the log library
# included in the NDK.
${log-lib}
)