2026/4/9 16:11:20
网站建设
项目流程
免费 网站 手机,昆明平台开发公司,wordpress 角色权限,网站如何接广告赚钱无需Android Studio#xff0c;脱离复杂的Gradle构建系统#xff0c;仅用命令行工具完成OpenCV Android .so库的编译
前言
最近在开发一个需要集成OpenCV的Android项目时#xff0c;我发现传统的Android Studio集成方式存在一些限制#xff1a;构建流程不透明、难以自定义模…无需Android Studio脱离复杂的Gradle构建系统仅用命令行工具完成OpenCV Android .so库的编译前言最近在开发一个需要集成OpenCV的Android项目时我发现传统的Android Studio集成方式存在一些限制构建流程不透明、难以自定义模块、集成到CI/CD流程复杂。经过一番探索我成功找到了一种纯命令行编译OpenCV Android库的方法整个过程完全掌控非常适合需要自定义构建或自动化集成的场景。本文将详细介绍我在Windows 11环境下使用Git Bash、Android NDK、CMake和Ninja从源码编译OpenCV 4.11.0 Android原生库的完整过程。环境准备在开始之前需要确保你的系统已安装以下工具工具 版本要求 作用Android NDK ≥ r21推荐r26 Android原生开发工具链CMake ≥ 3.18 跨平台构建系统Git for Windows 最新版 提供Bash环境Ninja 最新版 高性能构建系统工具路径示例我的实际环境配置如下· OpenCV源码D:\opencv-4.11.0· Android NDKD:\AndroidSDK\ndk\26.3.11579264· CMakeD:\AndroidSDK\cmake\3.22.1\bin\cmake· NinjaD:\ndkTest\ninja-win\ninja.exe核心编译脚本经过多次调试和优化我总结出了以下可靠的编译脚本。这个脚本成功编译出了15个OpenCV Android动态库总大小约300MB。#!/bin/bash# # OpenCV 4.11.0 Android 纯命令行编译脚本# set-e# 出错即停止# 配置 OPENCV_SRC/d/opencv-4.11.0NDK_PATH/d/AndroidSDK/ndk/26.3.11579264CMAKE_BIN/d/AndroidSDK/cmake/3.22.1/bin/cmakeNINJA_BIN/d/ndkTest/ninja-win/ninja.exe# 编译选项 ABIarm64-v8a# 目标架构API_LEVEL24# Android API级别BUILD_TYPERelease# 构建类型BUILD_DIR/d/opencv_build_${ABI}# 构建目录INSTALL_DIR/d/opencv-android-output# 输出目录echoecho OpenCV 4.11.0 Android 纯命令行编译echo# 环境检查check_environment(){echo 环境检查...[-d$OPENCV_SRC]||{echo❌ OpenCV源码不存在:$OPENCV_SRC;exit1;}[-f$OPENCV_SRC/CMakeLists.txt]||{echo❌ OpenCV/CMakeLists.txt不存在;exit1;}[-f$CMAKE_BIN]||{echo❌ CMake不存在:$CMAKE_BIN;exit1;}[-f$NINJA_BIN]||{echo❌ Ninja不存在:$NINJA_BIN;exit1;}[-f$NDK_PATH/build/cmake/android.toolchain.cmake]||{echo❌ NDK android.toolchain.cmake不存在;exit1;}echo✅ 环境检查通过}# 清理构建目录clean_build_dir(){echo 清理构建目录...rm-rf$BUILD_DIRmkdir-p$BUILD_DIRcd$BUILD_DIR}# CMake配置configure_cmake(){echo⚙️ CMake配置...echo 构建目录:$BUILD_DIRecho 源码目录:$OPENCV_SRC$CMAKE_BIN\$OPENCV_SRC\-GNinja\-DCMAKE_MAKE_PROGRAM$NINJA_BIN\-DCMAKE_TOOLCHAIN_FILE$NDK_PATH/build/cmake/android.toolchain.cmake\-DANDROID_ABI$ABI\-DANDROID_PLATFORMandroid-$API_LEVEL\-DANDROID_STLc_shared\-DCMAKE_BUILD_TYPE$BUILD_TYPE\-DBUILD_JAVAOFF\-DBUILD_opencv_javaOFF\-DBUILD_SHARED_LIBSON\-DBUILD_opencv_coreON\-DBUILD_opencv_imgprocON\-DBUILD_opencv_imgcodecsON\-DBUILD_TESTSOFF\-DBUILD_EXAMPLESOFF\-DBUILD_PERF_TESTSOFF\-DBUILD_ANDROID_EXAMPLESOFF\-DBUILD_ANDROID_PROJECTSOFF[$?-eq0]echo✅ CMake配置成功||{echo❌ CMake配置失败;exit1}}# 编译OpenCVcompile_opencv(){echo 开始编译...$CMAKE_BIN--build.--parallel8[$?-eq0]echo✅ 编译成功||{echo❌ 编译失败;exit1}}# 整理输出文件collect_output(){echo 整理输出文件...rm-rf$INSTALL_DIRmkdir-p$INSTALL_DIR/libs/$ABImkdir-p$INSTALL_DIR/include# 复制.so文件echo 复制.so文件...if[-dlib];thenSO_PATHS(lib/$ABI/*.solib/*.so*.sobin/*.so)forpatternin${SO_PATHS[]};doifls$pattern1/dev/null21;thenecho 找到文件:$patterncp$pattern$INSTALL_DIR/libs/$ABI/2/dev/null||truefidonefi# 复制头文件echo 复制头文件...cp-r$OPENCV_SRC/include/opencv2$INSTALL_DIR/include/2/dev/null||true# 统计结果localSO_COUNT$(ls$INSTALL_DIR/libs/$ABI/*.so2/dev/null|wc-l)echoechoecho 编译完成echoecho 结果统计echo 架构$ABIecho API Level$API_LEVELecho 构建类型$BUILD_TYPEecho 库文件数量$SO_COUNT个echo 输出目录$INSTALL_DIR}# 主流程main(){check_environment clean_build_dir configure_cmake compile_opencv collect_output}main$编译过程详解关键配置项解析脚本中的CMake配置选项是编译成功的关键# 禁用Java绑定 - 避免与Android构建系统冲突-DBUILD_JAVAOFF-DBUILD_opencv_javaOFF# 禁用Android示例项目 - 简化构建流程-DBUILD_ANDROID_EXAMPLESOFF-DBUILD_ANDROID_PROJECTSOFF# 启用动态库构建-DBUILD_SHARED_LIBSON# 使用c_shared STL - 确保运行时兼容性-DANDROID_STLc_shared# 仅启用核心模块可按需添加更多-DBUILD_opencv_coreON-DBUILD_opencv_imgprocON-DBUILD_opencv_imgcodecsON编译输出结果执行脚本后成功编译出15个OpenCV动态库库文件 大小 核心功能libopencv_core.so 23MB 核心数据结构与算法libopencv_imgproc.so 25MB 图像处理滤波、变换等libopencv_dnn.so 87MB 深度学习模块libopencv_imgcodecs.so 23MB 图像编解码JPEG、PNG等libopencv_calib3d.so 20MB 相机标定与3D重建libopencv_features2d.so 6.2MB 特征检测与匹配libopencv_gapi.so 76MB 图像处理流水线框架其他8个模块 总计~40MB ML、视频处理等编译耗时统计· CMake配置阶段约2-3分钟· 编译阶段约20-30分钟1340个构建任务· 总计约25-35分钟取决于CPU性能在Android项目中的使用CMake集成示例在Android项目的CMakeLists.txt中添加以下配置cmake_minimum_required(VERSION 3.18.1) project(MyOpenCVApp) # 设置OpenCV路径 set(OPENCV_ANDROID_DIR /d/opencv-android-output) # 包含头文件 include_directories(${OPENCV_ANDROID_DIR}/include) # 添加你的原生库 add_library(native-lib SHARED native-lib.cpp ) # 链接OpenCV库 target_link_libraries(native-lib ${OPENCV_ANDROID_DIR}/libs/${ANDROID_ABI}/libopencv_core.so ${OPENCV_ANDROID_DIR}/libs/${ANDROID_ABI}/libopencv_imgproc.so # ... 其他需要的库 log android )JNI简单测试创建一个简单的JNI函数测试OpenCV功能#includejni.h#includeandroid/log.h#includeopencv2/opencv.hppexternCJNIEXPORT jstring JNICALLJava_com_example_app_MainActivity_testOpenCV(JNIEnv*env,jobject/* this */){// 创建测试图像cv::MattestMat(100,100,CV_8UC3,cv::Scalar(0,255,0));// 转换为灰度cv::Mat grayMat;cv::cvtColor(testMat,grayMat,cv::COLOR_BGR2GRAY);std::string resultOpenCV 4.11.0工作正常\n;result图像尺寸: std::to_string(testMat.cols)xstd::to_string(testMat.rows);returnenv-NewStringUTF(result.c_str());}常见问题与解决方案问题1CMake配置失败症状CMake Error: The source directory does not appear to contain CMakeLists.txt解决# 验证OpenCV源码路径ls-la/d/opencv-4.11.0/CMakeLists.txt# 确保使用的是正确的路径格式Git Bash使用正斜杠问题2编译时内存不足症状编译过程卡住或编译器被杀死解决# 减少并行编译线程数$CMAKE_BIN--build.--parallel4# 改为4线程# 关闭其他内存占用大的程序问题3生成的.so文件找不到症状编译成功但输出目录为空解决# 手动查找.so文件find/d/opencv_build_arm64-v8a-name*.so-typef# 检查lib目录结构ls-la/d/opencv_build_arm64-v8a/lib/进阶优化多ABI架构支持修改脚本支持批量编译多个架构#!/bin/bash# 批量编译多个ABIABI_LIST(arm64-v8aarmeabi-v7ax86_64)forABIin${ABI_LIST[]};doecho开始编译$ABI...# 修改ABI变量并重新执行编译逻辑BUILD_DIR/d/opencv_build_${ABI}# ... 编译流程done模块化定制根据项目需求选择编译的模块# 基础图像处理配置最小化-DBUILD_LISTcore,imgproc,imgcodecs# 计算机视觉项目配置-DBUILD_opencv_calib3dON-DBUILD_opencv_features2dON-DBUILD_opencv_objdetectON# 禁用不需要的模块以减少体积-DBUILD_opencv_dnnOFF-DBUILD_opencv_gapiOFF总结通过纯命令行方式编译OpenCV Android库我获得了以下优势完全掌控构建过程可以精确控制编译选项和模块脱离Android Studio依赖适合CI/CD自动化流程定制化程度高按需编译减少应用体积学习价值大深入理解OpenCV构建系统这种编译方式特别适合· 需要特定OpenCV配置的项目· 对应用体积敏感的生产环境· 自动化构建和部署流程· 学习和研究OpenCV内部结构希望这篇记录能帮助到有类似需求的开发者。如果在实践过程中遇到问题欢迎留言讨论。相关资源· OpenCV官方源码· Android NDK下载· 完整脚本下载编译环境Windows 11 Git Bash Android NDK r26 OpenCV 4.11.0