通过CMakeLists调用第三方静态库需要加入以下CMake配置:
add_library( mytaglib #这是我即将调用第三方静态库,不需要写完整的静态库名。
STATIC
IMPORTED )
set_target_properties( mytaglib
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/libs/x86/libmytaglib.a ) #libmytaglib.a是完整的库名。
target_link_libraries( mediafile-lib #这是我自己创建的动态库。
mytaglib
#z #有人说要加个z库。其实不加也可以编译通过,并且能运行;加了也没有报错。
${log-lib} ) #这是NDK库文件
build.gradle(app)里面也有一项必要的配置:
externalNativeBuild {
cmake {
arguments '-DANDROID_PLATFORM=android-23',
'-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
}
}
build.gradle(app)的配置里面少了上面这一段,就会导致编译不通过(目前我发现上面这一段仅仅是针对调用静态库的时候需要用到)。
其实这一套配置的作用是把第三方静态库mytaglib导入到我自己创建的动态库mediafile_lib中,然后主程序里面通过
static {
System.loadLibrary("mediafile-lib");
}
上面这一段程序就可以通过jni调用mytaglib的库函数了。
下面是我CMakeLists的完整配置和build.gradle(app)的部分配置:
CMakeLists:
add_library( mediafile-lib #我创建的动态库
SHARED
src/main/java/com_citos_ax5mediaplayer_MediaFileScanner.h
src/main/cpp/native-lib.cpp)
#第三方静态库是提供了头文件的,但是很奇怪的是我这里并没有对头文件进行引用,jni里面通过#include依旧是能使用的。
#include_directories( src/main/cpp/include/ )
add_library( mytaglib #我调用的第三方静态库
STATIC #注意这里的STATIC关键词和下面的IMPORTED关键词,必须这么用
IMPORTED )
set_target_properties( mytaglib
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/libs/x86/libmytaglib.a )
find_library( log-lib
log )
target_link_libraries( mediafile-lib
mytaglib
#z
${log-lib} )
build.gradle(app):
...
android {
...
defaultConfig {
ndk {
ldLibs "log"//实现__android_log_print
abiFilters 'x86'//, 'armeabi-v7a' //我的库是x86的,所以这里需要过滤一下
}
...
externalNativeBuild {
cmake {
cppFlags ""
}
}
externalNativeBuild {
cmake {
arguments '-DANDROID_PLATFORM=android-23',
'-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
}
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
...