ndk 编译opencv(去除libandroid.so mediandk依赖)

发布于:2025-02-11 ⋅ 阅读:(23) ⋅ 点赞:(0)

简单的bash运行

需要关注的:

  • OPENCV_EXTRA_MODULES_PATH : opencv contrib库
  • BUILD_opencv_XXX :添加contrib库后默认是contrib库全部编译,用这个控制需要关闭的
  • NDK的路径
export ANDROID_NDK=/media/hello/data/3rd_party/25.2.9519653

# rm -rf ndk_build

# mkdir ndk_build
cd ndk_build

cmake .. -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
	-DANDROID_ABI="arm64-v8a" \
	-DANDROID_NDK=$ANDROID_NDK \
	-DANDROID_PLATFORM=android-29 \
    -DANDROID_STL=c++_shared \
	-DOPENCV_EXTRA_MODULES_PATH=/media/hello/data/3rd_party/opencv4.6.0/opencv_contrib/modules \
	-DBUILD_JAVA=OFF \
	-DBUILD_FAT_JAVA_LIB=OFF \
	-DBUILD_ANDROID_EXAMPLES=OFF \
	-DWITH_ONNX=ON \
	-Dfreetype_DIR=/media/hello/data/3rd_party_lib/freetype/2.13.2/arm64-v8a/lib/cmake/freetype/ \
	-DFREETYPE_INCLUDE_DIRS=/media/hello/data/3rd_party_lib/freetype/2.13.2/arm64-v8a/include/freetype2 \
	-DFREETYPE_LIBRARIES=/media/hello/data/3rd_party_lib/freetype/2.13.2/arm64-v8a/lib/libfreetype.so \
	-Dharfbuzz_DIR=/media/hello/data/3rd_party_lib/harfbuzz/9.0.0/arm64-v8a/lib/cmake/harfbuzz/ \
	-DHARFBUZZ_INCLUDE_DIRS=/media/hello/data/3rd_party_lib/harfbuzz/9.0.0/arm64-v8a/include/harfbuzz \
	-DHARFBUZZ_LIBRARIES=/media/hello/data/3rd_party_lib/harfbuzz/9.0.0/arm64-v8a/lib/libharfbuzz.so \
	-DWITH_FREETYPE=ON \
	-DBUILD_opencv_freetype=ON \
	-DCMAKE_BUILD_TYPE=Release \
	-DBUILD_SHARED_LIBS=ON \
	-DWITH_ARUCO=OFF \
	-DBUILD_opencv_barcode=OFF \
	-DBUILD_opencv_bgsegm=OFF \
	-DBUILD_opencv_datasets=OFF \
	-DBUILD_opencv_python2=OFF \
    -DBUILD_opencv_python3=OFF \
	-DBUILD_TESTS=OFF \
    -DCMAKE_INSTALL_PREFIX=/media/hello/data/3rd_party_lib/opencv/4.6.0/arm64-v8a \
    -DCMAKE_CXX_FLAGS="-frtti -Os" \
    -DCMAKE_C_FLAGS="-Os"

make -j$(nproc)

make install

在libopencv_videoio.so中会包含

hello@hello:/media/hello/data/3rd_party/opencv4.6.0/opencv-4.6.0$ objdump -x /media/hello/data/3rd_party_lib/opencv/4.6.0/arm64-v8a-src/sdk/native/libs/arm64-v8a/libopencv_videoio.s
o |grep NEEDED
  NEEDED               libopencv_imgcodecs.so
  NEEDED               libdl.so
  NEEDED               liblog.so
  NEEDED               libopencv_imgproc.so
  NEEDED               libopencv_core.so
  NEEDED               libandroid.so
  NEEDED               libmediandk.so
  NEEDED               libcamera2ndk.so
  NEEDED               libc++_shared.so
  NEEDED               libc.so

对于简单的应用不需要和android互操作的,想要去除libandroid.so libmediandk.so的依赖:
在modules/videoio/cmake/init.cmake中注释掉下面这两个

# add_backend("android_mediandk" WITH_ANDROID_MEDIANDK)
# add_backend("android_camera" WITH_ANDROID_NATIVE_CAMERA)

去除后

hello@hello:/media/hello/data/3rd_party/opencv4.6.0/opencv-4.6.0$ objdump -x /media/hello/data/3rd_party_lib/opencv/4.6.0/arm64-v8a/sdk/native/libs/arm64-v8a/libopencv_videoio.so |grep NEEDED
  NEEDED               libopencv_imgcodecs.so
  NEEDED               libdl.so
  NEEDED               libopencv_core.so
  NEEDED               libc++_shared.so
  NEEDED               libc.so