Android Stduio里编译打包C语言文件

一、新建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文件中的功能。

猜你喜欢

转载自blog.csdn.net/ppss177/article/details/130834002
今日推荐