自 android studio 2.2 +后就集成了ndk开发, 自带cmake 编译器.
编写ndk时候,配置很简单。再也不需要用android.mk配置文件。
如果要添加第三方的xx.a链接库
通常把第三方提供的h文件夹,放在cpp的include里面。
这是规范,不是必须。我的就没放,而xxx.a库放在/src/main/libs/armeabi-v7a/目录下。
本文章以添加libspeex.a连接库做例子
1.首先在/src/main/jni目录下建立一个include文件夹,
把speex官方提供的头文件文件夹拷贝到include里面
2.在app的src目录的main下,建立一个文件夹,
Libs,然后在jniLibs里面再建立一个armeabi-v7a(根据个人配置来)文件夹。
然后把libspeex.a链接库拷贝进去。
3.第三步, 动态库与头文件拷贝进去时候,是需要告诉编译器做关联的。
在app目录的src文件夹下有个CMakeLists.txt文件,我们通过它编写配置信息
将speex头文件所在目录告诉编译,在里面添加
include_directories(#将头文件所在目录告诉编译器,在里面添加
src/main/jni/include/speex
src/main/jni/include/libspeex
)
我的有两个链接库,所以添加两个。
然后告诉编译器,libspeex.a在哪个目录下,并指定链接库的名称
接着添加
add_library(speex
STATIC
IMPORTED ) #添加预编译静态库,只需要告诉CMAKE导入项目即可
set_target_properties( speex
PROPERTIES IMPORTED_LOCATION
"${CMAKE_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libspeex.a")
(这个路径一定要仔细检查一遍,写错了会出现下面那个错误,一脸懵逼)
3.1 CMake 编译时报错
ninja: error: ......missing and no known rule to make itCMake
编译时报错 ninja: error: ......missing and no known rule to make it
Build command failed.
Error while executing process D:\SDK\cmake\3.10.2.4988404\bin\cmake.exe with arguments
{--build C:\Users\DELL\Desktop\sample_0820_videook\sample\app\.externalNativeBuild\cmake\debug\armeabi-v7a --target native-lib}
ninja: error: '../../../../src/libs/armeabi-v7a/libspeex.a',
needed by '../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so',
missing and no known rule to make it
这种问题一般就是CMakeLists.txt的配置路径写错了,多检查一下动态库/静态库的路径,头文件路径
4.0 .第四步,然后修改target_link_libraries,加多一行jsoncpp
target_link_libraries( # Specifies the target library.
native-lib
speex
# Links the target library to the log library
# included in the NDK.
${log-lib} )
4.1 有多个这样添加:(网上例程,链接:https://www.cnblogs.com/fnlingnzb-learner/p/7593488.html)
#添加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})
然后build一下就好了