一个普通的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 <jni.h>
#include <android/log.h>
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 中直接写上log
find_library(log-lib log)
# 链接
# 1 要生成的目标so 不能更改顺序
target_link_libraries(hello-jni Test ${log-lib})
编译运行以后,我们点击build下的Analazy Apk… 就能看到lib目录下生成了libhello-jni.so
如图