第二次用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}
)