Android NDk-JNi开发(三)、JNI简便开发流程,使用Cmake进行开发
1、使用cmake需要的环境
安装图片红框中的
2、创建一个工程,如下,勾选 Include C++ support选项
3、项目中会出现一个CmakeLists.txt文件,
里面的详细内容:
cmake_minimum_required(VERSION 3.4.1)//版本
//这个就是将我们的native-lib.cpp文件,生成最后的native-lib.so库文件
//这句话用java语言解释就是将native-lib.java文件编译成.class文件,然后打成native-lib.jar包
add_library(
#库的名字叫native-lib,最终会为我们生成native-lib.so
native-lib
#SHARED表示动态库,会被动态链接,在运行时被加载
#STATIC:静态库,是目标文件的归档文件,在链接其它目标的时候使用
#MODULE:模块库,是不会被链接到其它目标中的插件,但是可能会在运行时使用dlopen-系列的函数动态链接
SHARED
#/src/main/cpp/native-lib.cpp:这个c++的源文件
src/main/cpp/native-lib.cpp )
//add_library可以拥有多个
add_library(
jni_test
SHARED
src/main/cpp/jni_test.cpp )
//添加一些我们编译所需要依赖的本地库。比如,我们这里使用的log库(此处的log库是我们后面调试时需要用来打log日志的库,是NDK为我们提供的),并给log库起了个别名log-lib,方便后面使用。主要的作用:如果要更换log库,只要更改这一处就行,而不用处处修改。
find_library(
log-lib
log )
//链接 链接了刚刚创建的native-lib.so,并且是有顺序的,必须和add_library从上到下的顺序一样而且名字必须一样
//当然也可以链接其他库,如GLESv2库,log 日志库等
target_link_libraries(
native-lib // add_library第一个是 native-lib
jni_test // add_library第二个是 jni_test
GLESv2
#这里可以将${log-lib}修改成log。这么写的好处上面也说了,主要是方便修改
${log-lib} )
四、gradle的相关配置
android {
defaultConfig {
//这个是告诉我们,将我们的.cpp或者.c源文件去编译哪个平台下的so库
//如果不添加过滤,就是全平台。基本上android用不到全平台的.so库,现在手机大部分是arm、arm-v7a
externalNativeBuild {
cmake {
//给C++编译器的一些参数。与之对应的还有一个cFlags,cFlags就是给C编译器的一些参数
cppFlags ""
//添加了这个过滤,打包之后就只有一个armeabi-v7a.so库
abiFilters 'armeabi-v7a'
}
}
ndk{
//这个与上面的区别就是编译其他的.so。比如工程里用到了高德地图,配置了这一行进行打包的时, 候,只会将高德armeabi-v7a打包进apk里,其实还是一个过滤的作用,如果项目中没有使用其他第三方的so库,可以不用
abiFilters 'armeabi-v7a'
}
}
//配置CMakeLists.txt的地址。CMakeLists.txt可以写在电脑任何地方,在这配置一下地址就好了
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
最后如果是一个老项目使用cmake,先创建一个cmakeLists.txt文件,然后按照上面 步骤3 去配置cmakeLists.txt文件,最后按照步骤4配置好gradle文件,就可以了。