一、新建Module包含C文件
在cpp中导入相应的C文件,ctest.c文件中可以调用c文件中的接口函数,即将c文件中的对外接口在ctest.c中封装在java或kotlin的接口中,java或kotlin接口在java目录下的文件中声明,在ctest.c文件中具体定义。
设置相对应的NDK、CMakeLists的版本及编译打包的arm架构类型,在Tools->SDK Manager->Android SDK中安装、更新、查看对应版本号。
android {
namespace 'com.example.ctest'
compileSdk 33
ndkVersion "25.2.9519653"
...
defaultConfig {
minSdk 30
targetSdk 33
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
externalNativeBuild {
cmake {
//设置编译打包的arm架构类型
abiFilters "armeabi-v7a"
//or
abiFilters "arm64-v8a"
}
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.22.1"
}
}
二、定义对外接口
三、将c中的监听器回调结果传递处理
定义一个listener和一个setListener函数
interface IListener {
fun onEvent(code: Int)
}
external fun setListener(listener: IListener)
JNIEnv *ENV = NULL;
jmethodID progressListenerId;
jobject progressListenerObject;
JNIEXPORT void JNICALL
Java_com_example_gesture_ThrowDetector_setListener(JNIEnv *env, jobject thiz, jobject listener) {
ENV = env;
jclass listenerClass=(*ENV)->GetObjectClass(ENV,listener);
progressListenerObject=(*ENV)->NewGlobalRef(ENV,listener);
progressListenerId=(*ENV)->GetMethodID(ENV,listenerClass,"onEvent", "(I)V");//Listener中的方法和参数
callback(c_listener);//c中的监听器设置函数
}
listener_t c_listener(int param) {
(*ENV)->CallVoidMethod(ENV, progressListenerObject, progressListenerId, (jint)param)//将结果发送出去
}
四、打包
编译CTest Module,可以生成一个aar包,此aar包里含有c文件的功能,但不会暴露c文件中的具体实现,通过调用java或Kotlin的接口即可调用封装好的c文件中的功能。