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

文章介绍了如何在Android项目中新建一个包含C文件的Module,通过JNI调用C文件中的接口函数,并在Java或Kotlin中声明接口。配置NDK和CMakeLists以支持不同架构,然后定义对外接口和监听器回调机制。最后,编译生成aar包,供其他代码调用封装好的C功能。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值