第二次用cmakelist编译了,依然有很多坑
参考了官方文档
https://developer.android.com/studio/projects/add-native-code.html
1.missing and no known rule to make it 问题
很蛋疼,就是一个很简单的.so路径不对。但是路径放哪儿对呢,要看项目的build.gradle中设置的lib文件夹在哪儿。当你没有设置时,默认是jniLibs文件夹,所以要把so放在这里面,但是如果你设置了,那就要把文件夹放在那个指定的目录下面,就是下面这个设置。
sourceSets {
main {
jniLibs.srcDirs = ["libs"]
}
}
2.包含头文件的文件夹,引入一次即可
#include的文件夹
include_directories(${CURRENT_DIR}/src/main/jni/prebuilt/include)
include_directories(${CURRENT_DIR}/src/main/jni/include)
3.这次跟上一次还要不同的情况是,这次我需要用两个依赖库,然后生成两个工具库
然后我照葫芦画瓢,照之前的写,结果报了很多 cpp文件中的函数undefine
原因就出来链接库的时候,没有分开链接,正确链接如下,像下面这样,两个jni库,分别链接了两个库,这样这个错误就没了
#问题出在这儿,我是用了两个三方库,最后生成两个api库,就要写成两个链接
target_link_libraries(jnistblur_preview_api
stblur_preview_api
${log-lib}
${android_lib}
)
target_link_libraries(jnistblur_capture_api
stblur_capture_api
${log-lib}
${android_lib}
)
以下是完整的CMakeLists.txt文件,供参考
cmake_minimum_required(VERSION 3.4.1)
set(CURRENT_DIR ${CMAKE_SOURCE_DIR})
message("CURRENT_DIR:" ${CMAKE_SOURCE_DIR})
#include的文件夹
include_directories(${CURRENT_DIR}/src/main/jni/prebuilt/include)
include_directories(${CURRENT_DIR}/src/main/jni/include)
#此处可以通过多加几个addlibrary来针对多个cpp文件来生成多个.so文件
#它的用法跟Android.mk里的定义差不多
#需要留意,编译出来的文件放在\build\intermediates\cmake中,但是不用自己复制了,它会自动复制到
#jniLibs文件夹下
add_library(
jnistblur_preview_api SHARED
${CURRENT_DIR}/src/main/jni/com_sensetime_blur_BlurFilterLibrary.cpp
)
add_library(
jnistblur_capture_api SHARED
${CURRENT_DIR}/src/main/jni/com_sensetime_blur_BlurImageLibrary.cpp
)
#两个预编译好的库========================================================
add_library(stblur_preview_api SHARED IMPORTED)
set_target_properties(stblur_preview_api PROPERTIES IMPORTED_LOCATION
${CURRENT_DIR}/src/main/jniLibs/${ANDROID_ABI}/libstblur_preview_api.so)
#日啊,什么情况,这里加了${CURRENT_DIR}报undefine函数,不加报missing
#已经发现这里这的问题所在,这个so必须是放在指定的系统的lib文件夹下,也就是build.gradle如果不指定,就必须
#放在jniLibs文件夹下,如果指定了lib的文件夹,就必须放在那个指定的文件夹下
add_library(stblur_capture_api SHARED IMPORTED)
set_target_properties(stblur_capture_api PROPERTIES IMPORTED_LOCATION
${CURRENT_DIR}/src/main/jniLibs/${ANDROID_ABI}/libstblur_capture_api.so)
find_library(android_lib android)
find_library(log-lib log )
#undefine问题出在这儿,我是用了两个三方库,最后生成两个api库,就要写成两个链接
target_link_libraries(jnistblur_preview_api
stblur_preview_api
${log-lib}
${android_lib}
)
target_link_libraries(jnistblur_capture_api
stblur_capture_api
${log-lib}
${android_lib}
)
网友评论