前面我们已经介绍过,通过Gradle/命令行来编译Native代码,通过JNI/JNA来调用Native代码
这里我们再介绍一种新的方法,Gradle+CMake编译Native代码,很适合从C语言转过来的开发人员
其实CMake和NdkBuild的使用基本完全一样
只不过一个通过Android.mk来配置编译脚本,一个通过CMakeLists.txt来配置脚本
一个需要在Gradle里面开启NdkBuild,一个需要在Gradle里面开启CMake,仅此而已
我们以这个Lame库编译的博客为例,它本是通过Android.mk来编译的
这里我们只修改gradle文件和CMakeLists文件,就可以将其改为一个CMakeLists项目
NDK编译Lame库
build.gradle
android {
//加载指定位置的so库
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
//通过CMake编译Native代码
//开启这个选项后,会自动编译指定目录下的Native代码,生成so文件并自动引用
//开启此选项后,就不需要再将so库拷贝到sourceSets中指定的目录了,否则会引起so库重复错误
externalNativeBuild {
cmake {
path 'src/jni/CMakeLists.txt'
}
}
}
CMakeLists.txt
#设置最低CMake版本
cmake_minimum_required(VERSION 3.6.0)
#设置C++语法标准版本
set(CMAKE_CXX_STANDARD 11)
#设置忽略警告
add_definitions(
-Wno-error=format-security
)
#设置编译库的名称,类型,源文件
add_library(
lame
SHARED
JnaLame.cpp logcat.cpp liblame/bitstream.c liblame/bitstream.h liblame/encoder.c liblame/encoder.h liblame/fft.c liblame/fft.h liblame/gain_analysis.c liblame/gain_analysis.h liblame/id3tag.c liblame/id3tag.h liblame/l3side.h liblame/lame-analysis.h liblame/lame.c liblame/lame.h liblame/lameerror.h liblame/lame_global_flags.h liblame/machine.h liblame/mpglib_interface.c liblame/newmdct.c liblame/newmdct.h liblame/presets.c liblame/psymodel.c liblame/psymodel.h liblame/quantize.c liblame/quantize.h liblame/quantize_pvt.c liblame/quantize_pvt.h liblame/reservoir.c liblame/reservoir.h liblame/set_get.c liblame/set_get.h liblame/tables.c liblame/tables.h liblame/takehiro.c liblame/util.c liblame/util.h liblame/vbrquantize.c liblame/vbrquantize.h liblame/VbrTag.c liblame/VbrTag.h liblame/version.c liblame/version.h
)
#查找预编译好的系统模块库所在位置
find_library(
LIBRARY_PATH_LOG
log
)
#链接指定的路径到目标库
#add_library和target_link_libraries可以指定多个,这样就会编译出多个so文件
target_link_libraries(
lame
${LIBRARY_PATH_LOG}
)