Android(安卓)NDK Cmake学习记录
16lz
2021-12-04
一个普通的Android 项目变成支持NDK的项目需要一些配置
首先在app.gradle中需要增加一些cmake的设置,如下
android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.pbph.normaltondkdemo" minSdkVersion 19 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { //打包时候需要生成的支持CPU架构 abiFilters "armeabi-v7a" } externalNativeBuild{ cmake{ //编译时候指定cpu架构 abiFilters 'armeabi-v7a' } } } //cMake -> ninjjia->生成so externalNativeBuild{ cmake{ //在当前app目录下 path "CMakeLists.txt" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }}
比如我们有一个jni的c++文件
#include #include extern "C"{extern int test();}extern "C" void Java_com_pbph_normaltondkdemo_MainActivity_nativeTest(JNIEnv *env,jobject object){ test();}
,并且此文件需要依赖一个so库,在CMakeLists.txt 文件中(代码中已详细注释),注释部分包含如果引入的是静态库,也就是.a文件,应当如何添加
#cmake 版本cmake_minimum_required(VERSION 3.6)#引入include 文件 在使用的时候就可以在引入的时候不使用include相对路径,直接include 使用的的头文件即可include_directories(src/main/cmake/include)#定义全局的变量 csource 表示cmake目录下的所有c cpp 文件全部添加进去file(GLOB csource src/main/cmake/*.cpp src/main/cmake/*.c)# hello-jni 最终生成的so的名字(自定义名字没有要求) SHARED 动态库 文件路径add_library(hello-jni SHARED src/main/cmake/hello-jni.cpp)#add_library(hello-jni SHARED ${csource})#引入静态库IMPORTED表示我们这一个静态库以导入的形式添加进来 预编译静态库# Android abi 这是我们设置的armeabi-v7a#add_library(Test STATIC IMPORTED )##设置目标属性方法 设置一个导入路径在当前目录下#set_target_properties(Test PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/cmake/${ANDROID_ABI}/libTest.a)# 引入动态库的方法 set定义一个变量 由于我们使用c++ CMAKE_CXX_FLAGS#如果使用C编写的话那就是CMAKE_C_FLAGS#-L 库的查找路径set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}")# 会去NDK的库中去找 也可以直接在target_link_libraries 中直接写上logfind_library(log-lib log)# 链接# 1 要生成的目标so 不能更改顺序target_link_libraries(hello-jni Test ${log-lib})
编译运行以后,我们点击build下的Analazy Apk… 就能看到lib目录下生成了libhello-jni.so
如图
更多相关文章
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- Android(安卓)实现截屏
- android逆向工程教程
- Android(安卓)SDCard操作(文件读写,容量计算)
- Android文件操作
- ReactNative Android/iOS 打包详情流程
- android webview 使用js加载json文件失败
- 如何使Android应用程序获取系统权限