Android 使用 OpenCV (JNI 实现)

OpenCV 有提供 Android Jar 库。

可以使用 OpenCV.jar 去在 Android 中实现 OpenCV 的功能。

但是,有个问题:

Android 版本的 OpenCV 和 C++ 版本的接口存在一定的差异。

导致如果你想实现以前 C++ 版本的 OpenCV 功能,那么改动量还是不少的。

因此,如果你想快速在 Android 上使用 C++ 版本已经实现的 OpenCV 功能,那就可以采用以前讲到的 JNI。

下载 OpenCV Android 库

下载方式不介绍了,可以访问 https://opencv.org/releases.html 下载相应的 OpenCV 库。

我使用的是 opencv-3.4.3-android-sdk.zip

解压 OpenCV 压缩档

把压缩文档解压到特定目录,解压后得到:OpenCV-android-sdk 目录

其中我们要用到的文件在 OpenCV-android-sdk/sdk/native

其中更主要的几个目录是:

  • jni
    • include
      • opencv
      • opencv2
  • libs
    • arm64-v8a
    • armeabi
    • armeabi-v7a
    • mips
    • mips64
    • x86
    • x86_64
  • staticlibs
    • arm64-v8a
    • armeabi
    • armeabi-v7a
    • mips
    • mips64
    • x86
    • x86_64

libsstaticlibs 目录内还有其它架构(如:mipsmips64x86x86_64等)。

但 Android 常用 arm 架构,其它可自行考虑。

Android 使用 OpenCV (JNI 实现)_第1张图片

接下来在 Android 工程中建立 CMakeLists.txt,使用 CMake 编译 OpenCV 的 JNI 代码。

CMake 编译 OpenCV JNI


# 请注意,修改本地的 OPENCV_SDK_PATH (OpenCV-android-sdk 路径)# Sets the minimum version of CMake required to build the native library.#set(OPENCV_SDK_PATH D:/Code/OpenCV-android-sdk)#设置OpenCv的路径变量set(OPENCV_SDK_PATH  ${CMAKE_SOURCE_DIR}/src/main/cpp/opencv_src)#设置OpenCv的路径变量# 配置加载native依赖include_directories(${OPENCV_SDK_PATH}/sdk/native/jni/include                    ${CMAKE_SOURCE_DIR}/src/main/cpp/                    ${CMAKE_SOURCE_DIR}/src/main/cpp/include                    )set(CMAKE_VERBOSE_MAKEFILE on)set(OPENCV_DYNAMIC_LIBS "${OPENCV_SDK_PATH}/sdk/native/libs")         # 动态 opencv native 库路径set(OPENCV_STATIC_LIBS "${OPENCV_SDK_PATH}/sdk/native/staticlibs")    # 静态 opencv native 库路径set(OPENCV_ANDROID_ABI "${ANDROID_ABI}")link_directories("${OPENCV_DYNAMIC_LIBS}/${OPENCV_ANDROID_ABI}/")link_directories("${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/")# 添加库add_library(libopencv_java3 SHARED IMPORTED )set_target_properties(libopencv_java3 PROPERTIES        IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_java3.so")add_library(libopencv_calib3d STATIC IMPORTED )set_target_properties(libopencv_calib3d PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_calib3d.a")add_library(libopencv_core STATIC IMPORTED )set_target_properties(libopencv_core PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_core.a")add_library(libopencv_features2d STATIC IMPORTED )set_target_properties(libopencv_features2d PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_features2d.a")add_library(libopencv_flann STATIC IMPORTED )set_target_properties(libopencv_flann PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_flann.a")add_library(libopencv_highgui STATIC IMPORTED )set_target_properties(libopencv_highgui PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_highgui.a")add_library(libopencv_imgcodecs STATIC IMPORTED )set_target_properties(libopencv_imgcodecs PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_imgcodecs.a")add_library(libopencv_imgproc STATIC IMPORTED )set_target_properties(libopencv_imgproc PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_imgproc.a")add_library(libopencv_ml STATIC IMPORTED )set_target_properties(libopencv_ml PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_ml.a")add_library(libopencv_objdetect STATIC IMPORTED )set_target_properties(libopencv_objdetect PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_objdetect.a")add_library(libopencv_photo STATIC IMPORTED )set_target_properties(libopencv_photo PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_photo.a")add_library(libopencv_shape STATIC IMPORTED )set_target_properties(libopencv_shape PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_shape.a")add_library(libopencv_stitching STATIC IMPORTED )set_target_properties(libopencv_stitching PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_stitching.a")add_library(libopencv_superres STATIC IMPORTED )set_target_properties(libopencv_superres PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_superres.a")add_library(libopencv_video STATIC IMPORTED )set_target_properties(libopencv_video PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_video.a")add_library(libopencv_videoio STATIC IMPORTED )set_target_properties(libopencv_videoio PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_videoio.a")add_library(libopencv_videostab STATIC IMPORTED )set_target_properties(libopencv_videostab PROPERTIES        IMPORTED_LOCATION "${OPENCV_STATIC_LIBS}/${OPENCV_ANDROID_ABI}/libopencv_videostab.a")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DANDROID_STL=gnustl_static")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -llog")                         # logset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_java3              ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_calib3d            ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_core               ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_features2d         ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_flann              ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_highgui            ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_imgcodecs          ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_imgproc            ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_ml                 ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_objdetect          ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_photo              ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_shape              ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_stitching          ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_superres           ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_video              ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_videoio            ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lopencv_videostab          ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp                    ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2                         ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden         ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer        ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstrict-aliasing           ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections         ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections             ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math                 ")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lm                         ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp                    ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2                         ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden         ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fomit-frame-pointer        ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstrict-aliasing           ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections         ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections             ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffast-math                 ")set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lm                         ")file(GLOB FACE_API_SRC                        ${CMAKE_SOURCE_DIR}/src/main/cpp/faceapi_opencv.cpp                        )add_library( # Sets the name of the library.             test_facesdk             # Sets the library as a shared library.             SHARED             # Provides a relative path to your source file(s).             ${FACE_API_SRC}             )# Searches for a specified prebuilt library and stores the path as a# variable. Because CMake includes system libraries in the search path by# default, you only need to specify the name of the public NDK library# you want to add. CMake verifies that the library exists before# completing its build.find_library( # Sets the name of the path variable.              log-lib              # Specifies the name of the NDK library that              # you want CMake to locate.              log )# Specifies libraries CMake should link to your target library. You# can link multiple libraries, such as libraries you define in this# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.                        test_facesdk                        jnigraphics                        z                        libopencv_java3                        libopencv_calib3d                        libopencv_core                        libopencv_features2d                        libopencv_flann                        libopencv_highgui                        libopencv_imgcodecs                        libopencv_imgproc                        libopencv_ml                        libopencv_objdetect                        libopencv_photo                        libopencv_shape                        libopencv_stitching                        libopencv_superres                        libopencv_video                        libopencv_videoio                        libopencv_videostab                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} )

然后你就可以通过 JNI 接口,在 Android 中调用 OpenCV 的方法了。

更多相关文章

  1. Android SDK版本问题: conversion to dalvik format failed with
  2. android项目目录结构
  3. Android内核开发:源码的版本与分支详解
  4. Android发展以及历史版本号
  5. RatingBar 显示正常版本----断点记录
  6. Android提示版本更新的实现

随机推荐

  1. android loggin
  2. Android读写XML(下)——创建XML文档
  3. Android应用开发学习笔记之播放音频
  4. 在Android中加入GOOGLE统计系统
  5. android textview 中超出屏幕宽度的字符
  6. Delphi XE5的Android开发平台搭建
  7. android命令行启动
  8. android启动界面说明
  9. Android(安卓)TabHost学习笔记
  10. Android(安卓)Data Binder 的一个bug