在windows上交叉编译opencv供RK3588使用
环境
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