環境
NDK r27、RK3588 安卓板子、Android 12
步驟 | 操作要點 |
---|---|
1. NDK 下載 | 選擇 r27 版本,解壓到無空格路徑(如?C:/ndk ) |
2. 環境變量配置 | 添加?ANDROID_NDK_ROOT ?和工具鏈路徑到系統 PATH |
3. CMake 參數調整 | 指定?ANDROID_NATIVE_API_LEVEL=31 、ANDROID_ABI=aarch64-linux-android |
4. 生成與編譯 | 使用 Ninja 生成器,執行?cmake --build build --parallel 8 |
5. 驗證與部署 | 檢查庫文件架構,通過 adb 部署到設備并測試 |
完整命令執行步驟
1.打開 cmd.exe 并切換到合適目錄
mkdir F:/opencv_build
cd F:/opencv_build
2.?輸入并執行 CMake 配置命令
cmake -S F:/opencv3.4.1/opencv-3.4.1 -B build ^-DANDROID_NDK="C:/Users/wanyao.zhang/AppData/Local/Android/Sdk/ndk/27.0.12077973" ^-DCMAKE_INSTALL_PREFIX="F:/opencv3.4.1/opencv_install" ^-DCMAKE_TOOLCHAIN_FILE="C:/Users/wanyao.zhang/AppData/Local/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" ^-DANDROID_ABI="arm64-v8a" ^-DANDROID_NATIVE_API_LEVEL=31 ^-DCMAKE_TOOLCHAIN_NAME="aarch64-linux-android-clang" ^-G "Ninja" ^-DCMAKE_MAKE_PROGRAM="C:/Users/wanyao.zhang/AppData/Local/Android/Sdk/cmake/3.22.1/bin/ninja.exe" ^-DCMAKE_CXX_STANDARD=14 ^-DCMAKE_CXX_STANDARD_REQUIRED=ON ^-DCMAKE_POLICY_DEFAULT_CMP0057=NEW ^ -Wno-dev
1. -S F:/opencv3.4.1/opencv-3.4.1
作用:指定 OpenCV 源代碼的根目錄路徑。
含義:-S 表示 Source directory(源代碼目錄),即 OpenCV 的源代碼存放位置。
2. -B build
作用:指定構建輸出目錄。
含義:-B 表示 Build directory(構建目錄),生成的中間文件和編譯結果將存放在此目錄。這里設置為當前目錄下的 build 文件夾。
3. -DANDROID_NDK="..."
作用:指定 Android NDK 的路徑。
含義:-D 用于設置 CMake 變量,此處將 ANDROID_NDK 變量指向你安裝的 NDK 路徑。
確保路徑正確,且 NDK 版本(27.0.12077973)與 OpenCV 兼容(OpenCV 3.4.1 可能支持較舊的 NDK,需注意兼容性)。
4. -DCMAKE_INSTALL_PREFIX="..."
作用:指定編譯完成后安裝 OpenCV 庫的路徑。
含義:編譯成功后,OpenCV 的頭文件、庫文件等將安裝到 F:/opencv3.4.1/opencv_install 目錄。
5. -DCMAKE_TOOLCHAIN_FILE="..."
作用:指定 Android 的交叉編譯工具鏈配置文件。
含義:android.toolchain.cmake 是 NDK 提供的腳本,用于配置 Android 的編譯環境(如架構、API 級別等)。
必須與 NDK 版本一致,此處路徑正確。
6. -DANDROID_ABI="arm64-v8a"
作用:指定目標架構為 ARM64-v8a(64 位 ARM 設備)。
含義:確保編譯的庫適用于 64 位 Android 設備。其他常見架構包括 armeabi-v7a(32 位)、x86 等。
7. -DANDROID_NATIVE_API_LEVEL=31
作用:設置目標 Android API 級別。
含義:31 對應 Android 12。需確保你的設備或目標 SDK 版本兼容此 API 級別。
8. -DCMAKE_TOOLCHAIN_NAME="aarch64-linux-android-clang"
作用:指定編譯工具鏈名稱(可能冗余)。
含義:
aarch64-linux-android-clang 表示使用 Clang 編譯器為 ARM64 架構交叉編譯。
注意:-DCMAKE_TOOLCHAIN_FILE 已指定工具鏈文件,此參數可能被覆蓋,可嘗試刪除以避免沖突。
9. -G "Ninja"
作用:指定構建系統生成器為 Ninja。
含義:Ninja 是一個快速的構建工具,比默認的 Make 更高效。
10. -DCMAKE_MAKE_PROGRAM="..."
作用:指定 Ninja 的可執行文件路徑。
含義:確保 CMake 使用你指定的 Ninja 版本(路徑需正確)。
11. -DCMAKE_POLICY_DEFAULT_CMP0057=NEW
作用:設置 CMake 策略以解決路徑兼容性問題。
含義:
CMP0057 與路徑處理相關,設置為 NEW 可避免某些舊版本路徑問題。
通常在較新版本的 CMake 中默認已啟用,但顯式設置可確保兼容性。
3.?執行編譯與安裝
cd build
ninja -j 8
ninja install
編譯后,生成包含?libopencv_*.so
?文件(如?libopencv_core.so
、libopencv_imgproc.so
?等),將其復制到
app/src/main/jniLibs/arm64-v8a/
下集成應用。
但一開始未啟用動態庫構建:在 CMake 中,BUILD_SHARED_LIBS
?選項控制生成動態庫(.so
)還是靜態庫(.a
)。若未將其設置為?ON
,默認可能生成靜態庫。OpenCV 的 CMake 配置會遵循此選項,若未顯式開啟動態庫構建,最終產物就是一系列?.a
?文件。
于是刪除build文件夾,重新進行構建就可以了。
cmake -S F:/opencv3.4.1/opencv-3.4.1 -B build ^-DANDROID_NDK="C:/Users/wanyao.zhang/AppData/Local/Android/Sdk/ndk/27.0.12077973" ^-DCMAKE_INSTALL_PREFIX="F:/opencv3.4.1/opencv_install" ^-DCMAKE_TOOLCHAIN_FILE="C:/Users/wanyao.zhang/AppData/Local/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" ^-DANDROID_ABI="arm64-v8a" ^-DANDROID_NATIVE_API_LEVEL=31 ^-DCMAKE_TOOLCHAIN_NAME="aarch64-linux-android-clang" ^-G "Ninja" ^-DCMAKE_MAKE_PROGRAM="C:/Users/wanyao.zhang/AppData/Local/Android/Sdk/cmake/3.22.1/bin/ninja.exe" ^-DCMAKE_CXX_STANDARD=14 ^-DCMAKE_CXX_STANDARD_REQUIRED=ON ^-DCMAKE_POLICY_DEFAULT_CMP0057=NEW ^-DBUILD_SHARED_LIBS=ON