移动端 第三方库交叉编译

在 ARMv8(即 ARM64 或 aarch64)架构下编译 Boost 库需要配置交叉编译工具链,并针对目标架构进行适配。以下是详细步骤:


一、环境准备

  1. 安装 NDK
    确保已安装 Android NDK(建议版本 ≥ r25),可通过 Android Studio 的 SDK Manager 下载,或从 官网 获取。

  2. 配置工具链
    NDK 提供预构建的交叉编译工具链。定位到 NDK 目录下的 toolchains/llvm/prebuilt/linux-x86_64/bin(Linux/macOS)或 toolchains/llvm/prebuilt/windows-x86_64/bin(Windows),找到 aarch64-linux-androidXX-clang++(如 aarch64-linux-android33-clang++)。

  3. 下载 Boost 源码
    从 Boost 官网 下载源码(如 boost_1_84_0.tar.gz),解压到本地目录:

    bash
    复制
    tar -xzf boost_1_84_0.tar.gz
    cd boost_1_84_0

二、配置交叉编译工具链

先运行 bootstrap.bat 生成b2.exe  project-config.jam

1. 创建/修改 project-config.jam 文件

using clang : android
:
"C:/Users/ZackWork/AppData/Local/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android33-clang++.cmd" 
:
<archiver>"C:/Users/ZackWork/AppData/Local/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ar.exe"
<ranlib>"C:/Users/ZackWork/AppData/Local/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-ranlib.exe"
<target-os>android
<compileflags>-fPIC
<compileflags>-DNDEBUG
<compileflags>--sysroot=C:/Users/ZackWork/AppData/Local/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot
<compileflags>-I"C:/Users/ZackWork/AppData/Local/Android/Sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/include/c++/v1"
<linkflags>-stdlib=libc++
<linkflags>-static-libstdc++
;

2. 终端运行

./b2 toolset=clang-android target-os=android architecture=arm address-model=64 variant=release link=static,shared threading=multi runtime-link=shared --prefix=./boost-android-arm64 --with-system --with-filesystem install

 

 

在 ARMv8(即 arm64-v8a)架构下编译 OpenCV 库需要配置 Android NDK 的交叉编译工具链。以下是详细步骤:


一、环境准备

  1. 安装必要工具

    • 下载 Android NDK(建议 ≥ r25)。
    • 安装 CMake(≥ 3.22)和 Python(≥ 3.6)。
    • 确保系统已安装 wgetunzipmake 等基础工具。
  2. 获取 OpenCV 源码

    bash
    复制
    wget https://github.com/opencv/opencv/archive/refs/tags/4.9.0.zip
    unzip 4.9.0.zip && cd opencv-4.9.0

    如果需要额外的模块(如 opencv_contrib):

    bash
    复制
    wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.9.0.zip
    unzip 4.9.0.zip -d opencv_contrib

二、配置交叉编译工具链

  1. 创建 CMake 工具链文件
    在 OpenCV 源码目录下新建 android_arm64_toolchain.cmake,内容如下:

    cmake
    复制
    # 定义目标系统和编译器
    set(CMAKE_SYSTEM_NAME Android)
    set(CMAKE_SYSTEM_VERSION 33)                 # Android API 级别
    set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)         # 目标架构
    set(CMAKE_ANDROID_NDK /path/to/your/ndk)      # 替换为你的 NDK 路径
    set(CMAKE_ANDROID_STL_TYPE c++_shared)        # 使用动态 C++ 运行时库
    set(CMAKE_ANDROID_ARM_NEON TRUE)              # 启用 NEON 指令集
    
    # 指定编译器
    set(CMAKE_C_COMPILER   ${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android33-clang)
    set(CMAKE_CXX_COMPILER ${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android33-clang++)
    
    # 禁用 Java 和测试(减少依赖)
    set(BUILD_JAVA OFF)
    set(BUILD_TESTS OFF)
    set(BUILD_PERF_TESTS OFF)
  2. 配置第三方库(可选)​

    • 若需要支持 libjpeg-turbolibpng 等,需提前交叉编译这些库,并通过 CMake 参数指定路径:
      cmake
      复制
      set(JPEG_INCLUDE_DIR /path/to/jpeg/include)
      set(JPEG_LIBRARY /path/to/jpeg/lib/libjpeg.a)

三、编译 OpenCV

  1. 创建构建目录并配置 CMake

    bash
    复制
    mkdir build_android && cd build_android
    cmake \
      -DCMAKE_TOOLCHAIN_FILE=../android_arm64_toolchain.cmake \
      -DCMAKE_BUILD_TYPE=Release \
      -DANDROID_CPP_FEATURES="rtti exceptions" \
      -DBUILD_ANDROID_PROJECTS=OFF \
      -DBUILD_ANDROID_EXAMPLES=OFF \
      -DBUILD_SHARED_LIBS=ON \                    # 编译动态库(设为 OFF 则生成静态库)
      -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \  # 启用额外模块
      -DWITH_OPENCL=OFF \                         # 按需关闭不需要的模块
      -DWITH_CUDA=OFF \
      -DWITH_GTK=OFF \
      ..
  2. 开始编译

    bash
    复制
    make -j$(nproc)       # 使用多线程加速编译
    make install          # 将编译结果输出到 install 目录
  3. 关键参数说明

    • -DBUILD_SHARED_LIBS=ON:生成动态库(.so),设为 OFF 则生成静态库(.a)。
    • -DANDROID_CPP_FEATURES:启用 RTTI 和异常支持(某些功能需要)。
    • -DOPENCV_ENABLE_NONFREE=ON:启用专利算法(如 SIFT、SURF)。

四、集成到 Android 项目

  1. 拷贝库和头文件
    将编译结果(位于 install 目录下的 lib/arm64-v8a 和 include/)复制到 Android 项目的 app/src/main/cpp/opencv 目录。

  2. 配置 CMakeLists.txt
    在项目的 CMakeLists.txt 中添加 OpenCV 依赖:

    cmake
    复制
    # 设置 OpenCV 路径
    set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv/sdk/native/jni)
    find_package(OpenCV REQUIRED)
    
    # 添加头文件
    include_directories(${OpenCV_INCLUDE_DIRS})
    
    # 链接到目标库
    target_link_libraries(native-lib ${OpenCV_LIBS})
  3. 配置 gradle 支持 ABI
    在 app/build.gradle 中指定仅编译 arm64-v8a

    gradle
    复制
    android {
        defaultConfig {
            ndk { abiFilters 'arm64-v8a' }
        }
    }

五、常见问题解决

1. 编译时报错 NEON is not supported

  • 原因:未启用 NEON 指令集。
  • 解决:在工具链文件中添加:
    cmake
    复制
    set(CMAKE_ANDROID_ARM_NEON TRUE)
    set(ENABLE_NEON ON)

2. 运行时崩溃 java.lang.UnsatisfiedLinkError

  • 原因:动态库未正确打包或加载。
  • 解决
    • 检查 .so 文件是否在 app/src/main/jniLibs/arm64-v8a 目录下。
    • 在 Java 层加载库:
      java
      复制
      static { System.loadLibrary("opencv_java4"); }

3. 库体积过大

  • 优化方案
    • 仅编译必要模块(如关闭 -DBUILD_opencv_dnn=OFF)。
    • 使用 strip 工具删除调试符号:
      bash
      复制
      aarch64-linux-android-strip --strip-unneeded libopencv_*.so

六、示例:最小化编译配置

仅编译核心模块和 imgproc

bash
复制
cmake \
  -DCMAKE_TOOLCHAIN_FILE=../android_arm64_toolchain.cmake \
  -DBUILD_LIST=core,imgproc \
  -DBUILD_SHARED_LIBS=OFF \
  -DWITH_ITT=OFF -DWITH_IPP=OFF -DWITH_TBB=OFF \
  ..

通过以上步骤,可成功为 ARMv8 架构编译 OpenCV 库,并集成到 Android NDK 项目中。建议根据实际需求裁剪模块以优化体积。

 

 

 

在鸿蒙(HarmonyOS)Next 上使用 OpenCV 开发需要针对鸿蒙的编译工具链和系统特性进行适配。以下是详细的编译步骤和集成指南:


一、环境准备

  1. 安装鸿蒙开发工具

    • 下载并安装 ​DevEco Studio​(鸿蒙官方IDE),确保包含鸿蒙的 Native 开发套件(NDK)。
    • 配置鸿蒙的编译工具链,通常位于 HarmonyOS_SDK/native 目录下。
  2. 获取 OpenCV 源码

    bash
    复制
    git clone https://github.com/opencv/opencv.git
    cd opencv
    git checkout 4.9.0  # 选择稳定版本
  3. 安装依赖工具

    • CMake(≥3.15)、Ninja(推荐)、Python(≥3.6)。
    • 鸿蒙系统的交叉编译工具链(如 llvm-harmony 和 ohos-clang)。

二、配置鸿蒙编译工具链

  1. 创建鸿蒙专用的 CMake 工具链文件
    新建 ohos_toolchain.cmake,内容如下:

    cmake
    复制
    # 鸿蒙系统配置
    set(CMAKE_SYSTEM_NAME HarmonyOS)
    set(CMAKE_SYSTEM_VERSION 4.0.0)  # 根据实际版本调整
    set(CMAKE_ANDROID_NDK /path/to/harmony_ndk)  # 替换为鸿蒙NDK路径
    
    # 编译器路径
    set(CMAKE_C_COMPILER   "${CMAKE_ANDROID_NDK}/llvm/bin/clang")
    set(CMAKE_CXX_COMPILER "${CMAKE_ANDROID_NDK}/llvm/bin/clang++")
    
    # 目标架构(以armv8为例)
    set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
    set(CMAKE_C_FLAGS "-target aarch64-none-harmonyos")
    set(CMAKE_CXX_FLAGS "-target aarch64-none-harmonyos")
    
    # 系统根目录和库路径
    set(CMAKE_SYSROOT "${CMAKE_ANDROID_NDK}/sysroot")
    set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
    
    # 禁用Java和测试模块(减少依赖)
    set(BUILD_JAVA OFF)
    set(BUILD_TESTS OFF)
  2. 调整 OpenCV 的 CMake 配置
    OpenCV 默认可能不识别鸿蒙系统,需手动禁用部分不兼容功能:

    cmake
    复制
    # 在 OpenCV 的 CMakeLists.txt 中或通过命令行参数添加:
    -DWITH_GTK=OFF \
    -DWITH_V4L=OFF \
    -DWITH_ADE=OFF \
    -DBUILD_ANDROID_PROJECTS=OFF \
    -DBUILD_ANDROID_EXAMPLES=OFF \
    -DENABLE_PIC=ON  # 强制生成位置无关代码

三、编译 OpenCV

  1. 生成构建目录并配置 CMake

    bash
    复制
    mkdir build_harmony && cd build_harmony
    cmake \
      -DCMAKE_TOOLCHAIN_FILE=../ohos_toolchain.cmake \
      -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_SHARED_LIBS=OFF \         # 推荐静态库(鸿蒙对动态库加载有限制)
      -DBUILD_LIST=core,imgproc \       # 按需选择模块(减少体积)
      -DWITH_OPENMP=OFF \
      -DWITH_EIGEN=OFF \
      ..
  2. 执行编译

    bash
    复制
    cmake --build . -j$(nproc)
    cmake --install . --prefix=./install_harmony
  3. 处理依赖库(如必要)​

    • 若需 libjpeg 或 libpng,需提前交叉编译这些库,并在 CMake 中指定路径:
      cmake
      复制
      -DJPEG_INCLUDE_DIR=/path/to/jpeg/include \
      -DJPEG_LIBRARY=/path/to/jpeg/lib/libjpeg.a \

四、集成到鸿蒙项目

  1. 将编译结果导入项目

    • 将 install_harmony 下的 include 和 lib 目录拷贝到鸿蒙项目的 cpp/libs/opencv 中。
  2. 配置鸿蒙的 CMakeLists.txt
    在项目的 CMakeLists.txt 中添加 OpenCV 依赖:

    cmake
    复制
    # 设置 OpenCV 路径
    set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/libs/opencv)
    find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR}/lib/cmake/opencv4)
    
    # 添加头文件
    include_directories(${OpenCV_INCLUDE_DIRS})
    
    # 链接到目标库
    target_link_libraries(your_target PRIVATE ${OpenCV_LIBS})
  3. 鸿蒙的 build-profile.json 配置
    在鸿蒙的构建配置中声明 Native 依赖:

    json
    复制
    {
      "targets": [{
        "name": "default",
        "compileTargets": [ "//cpp:your_target" ],
        "externalNativeOptions": {
          "path": "src/main/cpp/CMakeLists.txt",
          "arguments": "-DOHOS_ARCH=arm64-v8a"
        }
      }]
    }

五、常见问题解决

1. 编译时报错 undefined reference to [symbol]

  • 原因:部分鸿蒙系统库与 OpenCV 不兼容。
  • 解决:手动链接缺失的库(如 -llog 或 -lz):
    cmake
    复制
    target_link_libraries(your_target PRIVATE log z)

2. 运行时崩溃 Permission denied

  • 原因:鸿蒙对动态库加载权限控制严格。
  • 解决
    • 优先使用静态库(BUILD_SHARED_LIBS=OFF)。
    • 在 config.json 中声明权限:
      json
      复制
      "abilities": [{
        "permissions": ["ohos.permission.USE_BLUETOOTH"]
      }]

3. 图像无法读取或处理失败

  • 检查:确保 libopencv_imgcodecs.a 已编译并正确链接。
  • 解决:在 CMake 中启用 imgcodecs 模块:
    cmake
    复制
    -DBUILD_LIST=core,imgproc,imgcodecs

六、优化建议

  • 裁剪模块:仅编译必要模块(如 -DBUILD_LIST=core,imgproc)。
  • 启用 NEON:在 CMake 中加 -DENABLE_NEON=ON 提升性能。
  • 符号裁剪:使用 strip 工具减小库体积:
    bash
    复制
    aarch64-harmonyos-strip --strip-unneeded libopencv_*.a

通过以上步骤,可以在鸿蒙Next上完成 OpenCV 的编译和集成,实现图像处理功能。建议优先使用静态库以减少依赖问题,并参考鸿蒙官方文档调整目标 API 级别和权限配置。

posted @ 2025-04-01 13:16  玥茹苟  阅读(231)  评论(0)    收藏  举报