自 android studio 2.2 +后就集成了ndk开发, 自带cmake 编译器. 编写ndk时候,配置很简单。再也不需要用android.mk配置文件。
新建一个带ndk开发项目的结构是这样的,
言归正传,那么要添加第三方的xx.a链接库呢?
通常我们把第三方提供的h文件夹,放在cpp的include里面。这是规范,不是必须。而xxx.a库放在src/main/jniLibs/armeabi目录下。
本文章以添加libjsoncpp.a连接库做例子
首先在cpp目录下建立一个include文件夹,把jsoncpp官方提供的头文件文件夹拷贝到include里面(我这个项目有3个链接库,jsoncpp, curl , openssl,另外2个仅做参考作用,与其无关)
第二步, 在app的src目录的main下,建立一个文件夹,jniLibs,然后在jniLibs里面再建立一个armeabi文件夹。
然后把libjsoncpp.a链接库拷贝进去。
第三步, 动态库与头文件拷贝进去时候,是需要告诉编译器做关联的。在app目录的src文件夹下有个CMakeLists.txt文件,我们通过它编写配置信息。
将jsoncpp头文件所在目录告诉编译,在里面添加
include_directories( src/main/cpp/include/jsoncpp)
例如有三个链接库,jsoncpp, currl , openssl.
include_directories( src/main/cpp/include/jsoncpp
src/main/cpp/include/curl
src/main/cpp/include/openssl
)
然后告诉编译器,libjsoncppp.a在哪个目录下,并指定链接库的名称
接着添加
#添加json库
add_library(jsoncpp STATIC IMPORTED)
set_target_properties(jsoncpp
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libjsoncpp.a)
然后修改target_link_libraries,加多一行jsoncpp
target_link_libraries(native-lib jsoncpp ${log-lib})
如果有多个,那么可以多次添加。如
#添加json库 add_library(jsoncpp STATIC IMPORTED) set_target_properties(jsoncpp PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libjsoncpp.a) #添加curl网络请求 add_library(curl STATIC IMPORTED) set_target_properties(curl PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcurl.a) #添加加密工具(md5, base64, des, aes , asa) part-1 add_library(crypto STATIC IMPORTED) set_target_properties(crypto PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.a) #添加加密工具(md5, base64, des, aes , asa) des加密 part-2 add_library(ssl STATIC IMPORTED) set_target_properties(ssl PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libssl.a)
target_link_libraries(native-lib jsoncpp curl crypto ssl ${log-lib})
然后gradle编译就可以使用了。是不是很简单?