转眼之间JNI的编程方式伴随着Android studio的升级进行好几次的大变革,从以前的手动执行javah,ndk-build,生成头文件,手动生成os库方式现在修改为:撰写CMakeLists.txt文件,配置CMakeLists.txt文件,自动生成方法形式进行,再需要花人工去智能实现头文件的生成,c/cpp文件引入的操作。具体实现步骤如下
1.创建CMakeLists.txt文件
app/CMakeLists.txt
#指定CMake构建本地库时所需的最小版本
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library. 将资源文件生成动态链接库(so文件)的库名称(文件名称:“lib" +设置的名称)
hello
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).资源文件(C或C++)的相对位置
src/main/jni/top_foxhome_demo_hellojni_JniUtil.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.将所有的add_library中的库链接起来,有多少个add_library成的库就将其添加到这里
hello #这个和add_library中的指定的so库名称一致
# Links the target library to the log library
# included in the NDK.
)
2.配置CMakeLists.txt文件
app/build.gradle
defaultConfig {
...
ndk {
abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
}
externalNativeBuild {
cmake {
cppFlags ""
//生成多个版本的so文件
abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
}
}
...
}
//与defaultConfig同级节点
externalNativeBuild {
cmake {
path "CMakeLists.txt" // 设置所要编写的c源码位置,以及编译后so文件的名字
}
}
3.撰写Java文件
app/src/main/java/top/foxhome/demo/hellojni/JniUtil.java
package top.foxhome.demo.hellojni;
public class JniUtil {
static {//"hello"这个名字需要与CMakeLists.txt中配置的一致
System.loadLibrary("hello");
}
public static native String getInfo();
}
3.代码提示自动创建c/c++中的方法
在Java文件中点击native上的提示自动创建即可
4.最后在c/cpp文件中实现方法即可。
注意:可能需要自行创建c或者cpp文件。
项目中提到的源码
https://github.com/JunjieHuang945/helloJNI