jni 就是一种提供java字节码调用C/C++的一种方案,jni描述的是一项技术
ndk 是一种将C/C++原生代码嵌入android 应用的工具,NDK描述的是工具集,能够在android中编译C/C++
我们区分 jni工程 与 普通工程 就是在 app下的build 文件中有一个 externalNativeBuild 方法
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
在你编译的时候 系统就会去找 这个 CMakeLists 文件 去解析你需要编译的 C/C++文件 然后就去找你本地的sdk 中的 cmake.exe 可执行的文件 进行编译
这是CMakeLists .txt
//这是他的可执行的最低版本
cmake_minimum_required(VERSION 3.4.1)
//编译库 第一个参数是库的名字 第二个是 编译的是静态的还是动态的 一般都是动态库 结尾是 .so 静态库 结尾是 .a 第三个参数是你要编译的 C/C++代码 可以是多个文件
add_library(native-lib
SHARED
native-lib.cpp )
//依赖其他第三方库 如果不写路径 就回去你的本地查找 第一个参数是别名 第二个是库地址 不写路径就是本地查找
find_library(log-lib
log )
//这个就是把第三方库 编译到你的系统中
target_link_libraries(
native-lib
${log-lib} )
接下来我们看示例
在java层 有 native方法
public native String stringFromJNI();
而对应的cpp文件 的代码是
#include <jni.h>
#include <string>
// 我们来聊一下 这个 extern C 是做什么的 我们都知道 C++和C 是不同的两种语言 有点像 kotlin 与 java的关系了 就是kotlin兼容java代码 他俩有不同的编译器 C++的编译器是gcc
//extern "C" 是吧下面的代码转换成 C代码
extern "C" JNIEXPORT jstring JNICALL
Java_com_inspiry_seial_maniutestjni_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
<