cmake方式导入第三方.a静态库以及编译库时出现ninja: error: '../../../../src/libs/armeabi-v7a/xxx.a', needed by '../../.

自 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一下就好了

发布了37 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/double_lee3/article/details/100517900