以OpenCV為例,記錄開發過程并附上部分踩坑細節
1.引入openCV的.a包,官方SDK目錄如下:

記得第三方也要引入。引入後的樣子如下:
你會發現,x86和arm的包不太一樣。
2.引入OpenCV頭檔案.h .hpp
首先,在你的cpp/include下,加入openCV的頭檔案,如下圖:
官方SDK在這裡:
3.CMake引入.a及你自己的c++源碼
先引入頭檔案:
set(libs ${CMAKE_SOURCE_DIR}/..)
include_directories(${libs}/cpp/include/opencv2)
set(target xxx) # 打包的名字
cmake文法就不在這裡贅述了。。。
上面一堆.a檔案,一個個引入,引入的寫法在下面:(以最重要的core為例)
add_library(core STATIC IMPORTED)
set_target_properties(core
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_core.a)
最終呈現的連結庫是這樣的:
帶勁不。。。
踩坑記錄:
1.報zlib的錯誤,缺少gzputs相關的,open、close什麼的。undefined symbol: gzputs
解決方案:
CMake加 find_package(ZLIB)
連結庫加 ZLIB::ZLIB
參考:https://stackoverflow.com/questions/53298492/how-to-link-zlib-with-cmake/56886808
2.報AMedia相關的錯誤。undefined symbol: AMediaExtractor_new
解決方案:
連結庫加 mediandk
如果還遇到錯誤,參考:https://stackoverflow.com/questions/45251937/mediandk-undefined-reference-to-amediacodec-signalendofinputstream
3.報openCV相關錯誤。undefined reference to 'cv::waitKey(int)'
這個比較草蛋(一種蛋)。。。明明官方的.a檔案都引入了。
搜了下資料原來是編譯順序的問題,C++與Java不一樣。
你需要在連結庫的時候,把最核心的core,放到最後,最起碼放到報錯的imgproc這些後面:
參考:https://answers.opencv.org/question/186124/undefined-reference-to-cvsoftdoubleoperator/
4.報不知名錯誤: ld: error: undefined symbol: __write_chk
原因是NDK版本不一緻,你目前編輯器的NDK版本與.a的不一緻。
解決方案:
(1)嘗試降低/升高你的NDK版本。(參考了https://blog.csdn.net/printf123scanf/article/details/106136741)
(2)拿源碼重新編譯你目前版本NDK的.a靜态庫。
後一個方案适合大佬,我不是别問我怎麼編譯。。。問C++造輪子的工程師,他們很熟悉。
關于如何正确改變NDK版本我也給你找好了:(圖出自:https://stackoverflow.com/questions/66540676/invalid-revision-3-18-1-cmake-in-android-studio)
cmake換成NDK,那個“-”别亂點,如果點亂了确定會給你提示,點cancel重來哈。别怪我沒提醒你。。。(擦眼淚)
記得build.gradle也要改哈:ndkVersion = 'yours'
5.差不多能跑起來了,,,會報一個x86的錯誤。
解決方案:
在gradle的defaultConfig裡加
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
arm就夠你用了。。。如果真有x86需求的話,上面就說了openCV針對x86的指令集做了相容,那麼你的CMake就需要相容,咋相容等我有這個需求了再補充哈。(狗頭保命)
聲明一下這邊是:opencv2,so包是libopencv_java4.so
一般情況下這種知名的第三方都不會随便改的,是以一般是NDK19。
在開發過程中,高版本的NDK會讓你相容,在gradle的cmake加 arguments "-DANDROID_STL=c++_shared"。
這樣的話,編譯動态庫會有libc++.so,更換19可以去掉,這樣就隻打一個so包了。
每個人因為環境代碼不同肯定會遇到不同的問題,本篇文章不一定能解決您全部的問題。
但盡管如此,我也掉了好多頭發。。。我本可以不分享出來的,生活不易,希望能讓國内的開發者少走彎路。
故,侵究。