android - Android 版 OpenCV 能否利用标准 C++ 支持在适用于 Windows 的 Android Studio 2.2 上获得 native 构建支持?

标签 android windows opencv cmake java-native-interface

关于为 Android 正确构建原生 opencv 有很多问题和答案。一些使用 gradle,另一些使用外部工具。这些对原生 OpenCV 构建的众多、复杂且经常相互冲突的描述可以通过一致的起点进行简化;创建 Android Studio 2.2 Beta 项目时,有一种方法可以包含 C++ 支持: Include C++ Support enter image description here

此功能是在 2016 年 6 月左右添加的。请参阅 Android tools technical docs获取更多信息。

Using Android Studio 2.2 or higher with the Android plugin for Gradle version 2.2.0 or higher, you can add C and C++ code to your app by compiling it into a native library that Gradle can package with your APK. Your Java code can then call functions in your native library through the Java Native Interface (JNI). If you want to learn more about using the JNI framework, read JNI tips for Android.

检查 Include C++ Support生成一个名为 CMakeLists.txt 的外部构建文件.

# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             src/main/cpp/native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included 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 the
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       $\{log-lib} )

要识别使用 native (C++) OpenCV 代码的 Android 项目,该项目通常会包含一个 *.cpp包含 JNIEXPORT 的文件条目以及使用 #include <opencv...hpp> 的实现功能。这与导入 OpenCV 模块并将 libs 文件夹复制到 jniLibs 不同,后者只允许从 Java 调用 OpenCV 功能。

是否可以使用此起点来配置 OpenCV native “hello world”应用程序,以证明构建工作正常?

附加信息 8/22
因为这个谜题是关于 CMake 的更不用说 OpenCV,我想我会为那些对 OpenCV 不感兴趣的人提供一个项目起点。使用 OpenCV in Android Studio 中的信息,您可以相当快速地启动起点项目。 .

这是一个youtube video这显示了创建一个新的 Android Studio 项目、导入 OpenCV、配置 native C++ 构建,从而生成与 gitHub 中的应用程序相同的 OpenCV“hello world”应用程序。

附加信息 8/27
根据 Bruno Alexandre Krinski 的回答,今天提交的版本编译原生 OpenCV 调用:https://github.com/sengsational/HelloCv .关于“安装被阻止”消息还有一个单独的问题,在安装时,Android 会警告用户“此应用程序包含试图绕过 Android 安全保护的代码。”由于我不确定这是构建技术的问题,因此我不会扩展此问题以包含该问题(但如果有人对该问题有意见,请提出建议)。

#Added 2 path definitions to support 20160825 additions
set(pathToProject C:/Users/Owner/AndroidStudioProjects/HelloCv)
set(pathToOpenCv C:/Users/Owner/OpenCV-3.1.0-android-sdk)

#Added by the IDE on project create
cmake_minimum_required(VERSION 3.4.1)

#Two sets suggested by Bruno Alexandre Krinski 20160825
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

#Addition suggested by Bruno Alexandre Krinski 20160825
include_directories(${pathToOpenCv}/sdk/native/jni/include)

#Added by IDE on project create
add_library( native-lib SHARED src/main/cpp/native-lib.cpp )

#Addition suggested by Bruno Alexandre Krinski 20160825
add_library( lib_opencv SHARED IMPORTED )

#Addition suggested by Bruno Alexandre Krinski 20160825
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${pathToProject}/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)

#Added by IDE on project create
find_library( log-lib log )

#Added by IDE on project create, Removed and replace with additional parameter suggested by Bruno Alexandre Krinski 20160825
#target_link_libraries( native-lib $\{log-lib} )
target_link_libraries( native-lib $\{log-lib} lib_opencv)

最佳答案

看来您已经导入了 opencv 模块,现在,打开您的 CMakeList.txt 并添加以下行:

set(CMAKE_VERBOSE_MAKEFILE on)

add_library(lib_opencv SHARED IMPORTED)

set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION
path-to-your-project/MyApplication/app/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)


include_directories(path-to-opencv-directory/OpenCV-android-sdk/sdk/native/jni/include)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")

并编辑:

target_link_libraries( # Specifies the target library.
                   native-lib
                   lib_opencv
                   # Links the target library to the log library
                   # included in the NDK.
                   $\{log-lib} )

包括您创建的 lib_opencv。最后,您添加以下行:

abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'

在你的模块应用中,像这样:

externalNativeBuild {

    cmake {
        cppFlags "-std=c++11 -frtti -fexceptions"
        abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
    }
}

以及您添加的 buildTypes 的下方:

sourceSets {
    main {
        jniLibs.srcDirs = ['path to your application /MyApplication/app/src/main/jniLibs/']
    }
}

更多详情可以看这个:https://github.com/googlesamples/android-ndk/tree/master/cmake/hello-libs

关于android - Android 版 OpenCV 能否利用标准 C++ 支持在适用于 Windows 的 Android Studio 2.2 上获得 native 构建支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38958876/

相关文章:

Android 应用程序未在 android studio 上运行并强制关闭

android - Gradle依赖配置: implementation vs api vs runtimeonly vs compileonly

python - 为什么dlib的load_rgb_image()方法旋转一些图像?

opencv - 错误 LNK2019 : unresolved external symbol _ Open CV program

python - tensorflow 对象检测训练模型不起作用

Android ScrollView 性能

android - 如何通过我自己的 Android 应用程序与 Facebook 的 API 交互?

c - _set_printf_count_output() 在 Windows 7 下出现损坏

windows - 为 OpenGL 渲染枚举设备和显示模式

linux - 在装有 64 位英特尔第三代酷睿 i5 处理器的 32 位 Windows 7 上安装 64 位 CentOS