准备工作
- 更新NDK到最新版本(如果要使用特定版本的可以在项目Module的build.gradle添加指定版本配置)
- 新建cpp文件夹并添加打包文件
- 放入需要编译的C/C++文件
- 新建桥接文件 native-lib.c(桥接文件内容后边会具体说明)
- 新建CMakeLists.txt文件配置编译so选项
-
//设置Cmake最低版本 cmake_minimum_required(VERSION 3.4.1) # 设置项目名称 project(MyNativeProject) # 添加源文件 有多少.c文件都需要 .h文件只需要再.c文件内引入就行 add_library( native-lib SHARED native-lib.c ***.c ***.c ***.c) # 设置共享库的输出名称 set_target_properties(native-lib PROPERTIES LIBRARY_OUTPUT_NAME "file_name") # 查找日志文件库 find_library(log-lib log) # 指定链接器选项 target_link_libraries(native-lib ${log-lib})
-
- 添加项目Module的build.gradle编译配置
-
defaultConfig { ***** //其他配置 ***** ndkVersion "28.0.12674087" // 指定支持的 ABI ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } externalNativeBuild { cmake { // 正确指定 CMakeLists.txt 文件的路径 path file("src/main/cpp/CMakeLists.txt") } }
-
桥接文件native-lib.c
#include <jni.h>
#include <stdlib.h>
JNIEXPORT jstring JNICALL
Java_com_test_demo_JavaClass_testFun(
JNIEnv* env,
jobject /* this */) {
return (*env)->NewStringUTF(env,"Add Filter Success!");
}
JNIEXPORT jstring JNICALL Java_com_test_demo_JavaClass_testFun
JNIEXPORT:导出方法
jstring:返回一个字符串
Java_com_test_demo_javaClass_testFun:
com_test_demo:调用Module ID com.test.demo
JavaClass:Java调用方法类名
testFun:方法名
JNIEnv* env:指向JNI环境的指针,通过它可以访问JNI提供的许多函数,这些函数用于操作Java对象、字符串、数组等。
jobject:调用该方法的Java对象实例即javaClass的实例对象
JNIEnv* env,jobject /* this */是方法需要的特定参数,后边可以跟C中需要的参数然后调用C的方法。
编译
- Sync Gradle
- Build->make Project
编译完成后会在app->build->intermediates->cxx内找到包含各种ABI的so文件。
Android so使用
项目内在main文件夹内(即cpp同级目录)新建jniLibs文件夹放入编译的so文件
在com.test.demo下新建javaClass类并引入so文件
static {
System.loadLibrary("file_name");
}
public native String testFun();
public JavaClass(){
Log.v("输出:",testFun());
}
默认编译的so文件名称是libfile_name,使用的时候需要去除lib字符