构建适用于 Android 的 OpenCV 并将其与 NDK 一起使用

2023-11-26

背景:我目前正在 Android Studio 上为 Moverio BT 200 增强现实眼镜开发一个应用程序。我正在使用 OpenCV,特别是该库的 arUco 模块。该模块必须与 NDK 一起使用。另外,它不在稳定版本中,所以我自己编译了该库(使用本指南:https://zami0xzami.wordpress.com/2016/03/17/building-opencv-for-android-from-source/)。图书馆建设进展顺利。之后,我做了一个android studio项目(customOCVtest)。我按照将 OpenCV 与 Android Studio 和 NDK 结合使用时一贯的方式进行操作,只不过这次是使用自定义构建。我检查了库是否已正确加载:

private static final String OCVdevTAG = "OCVmainAct";

static {
    System.loadLibrary("native-lib");
    if(!OpenCVLoader.initDebug()) {
        Log.d(OCVdevTAG, "OpenCV not loaded");
    } else {
        Log.d(OCVdevTAG, "OpenCV loaded");
    }
}

当我构建时,该库确实已加载。

现在问题来了:当我尝试在本机代码中实际使用 arUco 模块时(这是我的 native-lib.cpp):

#include <jni.h>
#include <string>
#include <opencv2/aruco.hpp>

extern "C" {
jstring
Java_com_jambonsama_customocvtest_MainActivity_stringFromJNI(
    JNIEnv *env,
    jobject /* this */) {
std::string hello = "Hello from C++";
cv::Ptr<cv::aruco::Dictionary> dict = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::Mat marker;
cv::aruco::drawMarker(dict, 25, 200, marker, 1);
return env->NewStringUTF(hello.c_str());
}
}

gradle 同步可以工作,但我无法构建。我收到以下错误:

Error:FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
Error while executing 'C:\Users\JambonSama\AppData\Local\Android\Sdk\cmake\3.6.3155560\bin\cmake.exe' with arguments {--build C:\Users\JambonSama\AndroidStudioProjects\customOCVtest\app\.externalNativeBuild\cmake\debug\mips64 --target native-lib}
[1/1] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\mips64\libnative-lib.so
FAILED: cmd.exe /C "cd . && C:\Users\JambonSama\AppData\Local\Android\sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  -target mips64el-none-linux-android -gcc-toolchain C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64 --sysroot=C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/platforms/android-21/arch-mips64 -fPIC -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -fno-exceptions -fno-rtti -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security -fno-exceptions -fno-rtti  -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info  -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\mips64\libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o  C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_aruco.a -llog -lm "C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/mips64/libgnustl_static.a" && cd ."
C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Users/JambonSama/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64/lib/gcc/mips64el-linux-android/4.9.x/../../../../mips64el-linux-android/bin\ld: C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a(alloc.cpp.o): Relocations in generic ELF (EM: 40)
  C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a: error adding symbols: File in wrong format
  clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

特别是,此错误消息告诉我,我尝试使用以下参数进行构建:

{--build C:\Users\JambonSama\AndroidStudioProjects\customOCVtest\app\.externalNativeBuild\cmake\debug\mips64 --target native-lib}

这个参数是AS自动生成的,我找不到它传递的文件。我相信,如果我能找到它,我就可以为arm构建(这就是我想要的),而不是mips。问题是,我找不到它。 (我什至不确定这确实是我正在寻找的。我只是想让我的项目适合我的眼镜。)

下面是我的 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 )

include_directories(C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/jni/include)

# 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
                       C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_core.a
                       C:/Libs/opencv_src/opencv/platforms/build_android_arm/install/sdk/native/libs/armeabi-v7a/libopencv_aruco.a

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

这是我的应用程序 build.gradle :

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.1"
    defaultConfig {
        applicationId "com.jambonsama.customocvtest"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jniLibs/'] } }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
    compile project(':openCVLibrary310dev')
}

和我的 openCVLibrary310dev build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "23.0.2"

    defaultConfig {
        ndk {
            abiFilter("armeabi-v7a")
        }
        minSdkVersion 14
        targetSdkVersion 25
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

我尝试过的,主要是通过复制帮助其他人解决与我的问题相似的问题的内容:

#set(CMAKE_SYSTEM_NAME Android)

or

#set(CMAKE_TOOLCHAIN_FILE "Toolchain file" CACHE FILEPATH "C:/Libs/opencv_src/opencv/platforms/android.toolchain.cmake")

or

#set( CMAKE_CXX_COMPILER "C:/Libs/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++.exe" )

在 CMakeLists.txt 中

and

splits {
    abi {
        enable true
        reset()
        include 'armeabi-v7a'
        universalApk true
    }
}

or

tasks.getByPath(":app:linkMipsDebugRemoteDesktopSharedLibrary").enabled = false

在 build.gradle 中(我尝试了两者,因为我不知道哪一个应该拥有它)。

除了最后一段代码(task.getByPath ...)之外,同步有效,但我无法构建。对于最后一个,我什至无法同步。

我还尝试重建 mips 库,因为架构似乎是问题所在,但我不知道该怎么做。

我在哪里可以找到包含以下参数的文件:

{--build C:\Users\JambonSama\AndroidStudioProjects\customOCVtest\app\.externalNativeBuild\cmake\debug\mips64 --target native-lib}

构建时通过?和/或如何让 Android Studio 构建我的 Arm 架构项目?


因此,可以通过将以下代码添加到app的gradle.build中,在android块的末尾来解决mips架构问题:

productFlavors {
    armv7 {
        ndk {
            abiFilter "armeabi-v7a"
        }
    }
    fat
}

但随后,其他问题又出现了。值得注意的是,该库是使用胡萝卜素选项构建的,Android Studio 不喜欢这个选项,然后,gzlib 缺失,因此 Android Studio 无法构建和/或运行。因此,经过多次尝试,我终于实现了我想要的:在 Windows 上对 openCV 与 Android 的额外模块进行交叉编译,并使用上述构建的库构建一个 AS 项目以便它发挥作用。我记录了我的整个过程,从下载 openCV 源代码到在我的 arm 架构设备上运行我的应用程序,我将把它复制粘贴到这里,供任何也需要这样做的人使用。以下说明主要基于本教程(感谢写它的 Zamrath Nizam)。该教程的唯一问题是它可能有点旧,因此需要更改一些选项/步骤。

从源代码交叉编译 OPENCV,并使用 WINDOWS10 中适用于 Android 的额外模块

*第一:先决条件*

  • 下载 OpenCV 并解压(例如在“../opencv-source”)
  • 下载 OpenCV 额外模块并解压(例如在“../opencv-contrib-source”)
  • 下载 Android NDK(例如在“../ndk-dir”)
  • 下载 CMake(即“../cmake-dir”)和 MinGW(即“../mingw-dir”)
  • 安装Android Studio

* 第二:使用 CMake 配置 *

  • 转到“../opencv-source/platforms”并创建一个名为“build_android_arm”的文件夹
  • in CMake, fill the following first two fields with the following paths :
    1. 源代码在哪里:'../opencv-source'
    2. 在哪里构建二进制文件:'../opencv-source/platforms/build_android_arm'
  • add the following options via the 'Add Entry' :
    1. ANDROID_NDK,类型“路径”,值“../ndk-dir”
    2. ANDROID_NDK_HOST_X64,类型“布尔”,值 1
    3. CMAKE_TOOLCHAIN_FILE,类型“路径”,值“../opencv-source/platforms/android/android.toolchain.cmake”
  • 按“配置”
  • 选择“MinGW Makefiles”作为编译器
  • 选择“指定用于交叉编译的工具链文件”
  • press 'Next', and 'Finish'
    • 注意 1:只要没有出现错误消息,就一切正常。不必担心警告消息(例如 CMake 告诉您正在执行已弃用的操作)。
    • 注意 2:如果您无法在该步骤进行配置,请尝试阅读接下来的几点,它可能会有所帮助。
  • 通过“搜索”字段更改以下附加选项:

    1. EXTRA_MODULE_PATH,类型“路径”,值“../opencv-contrib-source/modules”
    2. WITH_CAROTENE,类型“布尔”,值 0
    3. BUILD_ZLIB, type 'bool', value 1
      • 注意:在此步骤之前您必须已经配置过一次,因为之前创建的变量会重新分组到“未分组条目”组下,而以下变量是 CMake 自动生成的变量,需要分组到正确的组中(这不是“未分组的条目”)。
  • 验证以下选项是否正确设置(通过“搜索”字段):

    1. ANDROID_NDK_HOST_X64,类型“布尔”,值 1
    2. CMAKE_MAKE_PROGRAM,输入“路径”,值“../mingw-dir/bin/mingw32-make.exe”。这个选项,实际上我的 CMake 配置中没有它。如果当您按“配置”时,它不起作用并且您没有此选项,那么您应该尝试添加它(但我不知道如何添加)。如果当您按“配置”时没有任何问题,则不必担心该变量。此检查来自上面链接的原始教程。
    3. CMAKE_TOOLCHAIN_FILE,类型“路径”,值“../opencv-source/platforms/android/android.toolchain.cmake”
  • 按“配置”

  • 选择“MinGW Makefiles”作为编译器
  • 选择“指定用于交叉编译的工具链文件”
  • 按“下一步”和“完成”
  • 按“生成”

* 第三:使用 mingw 编译 *

  • 转到 '../mingw-dir/msys/1.0' 并运行 'msys' bash 文件
  • 导航到“../opencv-source/platforms/android_arm”
  • 运行“mingw32-make”命令
  • 运行“mingw32-make install”命令

* 第四:安卓项目 *

  • launch Android Studio and create a new project :
    1. 选择文件 -> 新建 -> 新建项目...
    2. 将“应用程序名称”填写为“cOCV”
    3. 选中“包括 C++ 支持”框
    4. 点击下一步'
    5. 选择您的最小 SDK(假设 API 14:Android 4.0 (IceCreamSandwich)
    6. 单击“下一步”、“下一步”和“完成”
  • 转到文件 -> 新建 -> 导入模块...

    1. 提供'../opencv-source/platforms/android_arm/install/sdk/java'
    2. 单击“下一步”和“完成”
  • 更改 openCVLibraryXXX(导入模块)文件夹中的 build.gradle 文件中的目标:

    1. compileSdkVersion 和 targetSdkVersion 应该相同,大于或等于 23
    2. minSdkVersion 需与创建项目时指定的一致
  • 在 openCVLibraryXXX (导入模块)文件夹中的 build.gradle 文件中:

    1. 将“应用插件:com.android.application”替换为“应用插件:com.android.library”
    2. remove the line 'applicationId "org.opencv"'
      • 注意:完成最后一步是为了避免以下错误:“项目应用程序上未指定解析为不支持作为编译依赖项的 APK 存档”。
  • 将导入的库作为依赖项添加到“文件”->“项目结构”中的“应用程序”模块

  • 在 'app/src/main' 中创建 jniLibs 文件夹:

    1. 在左侧菜单的 Android 视图中右键单击“应用程序”
    2. 单击“新建文件夹-JNI 文件夹”
    3. 检查“更改文件夹位置”
    4. 将“目标源集”设置为“app/src/main/jniLibs”
  • 从“opencv-source/platforms/android_arm/install/sdk/native/libs”复制 OpenCV 库 进入新创建的文件夹(jniLibs) 'AndroidStudioProjects/cOCV/app/src/main/jniLibs' 文件夹

    • 注意:例如,我的 AndroidStudioProjects 文件夹位于“C:\Users\JambonSama\AndroidStudioProjects”。
  • 在 'opencv-contrib-source/modules/module_you_desperately_need/CMakeLists.txt' 中,将 'ocv_define_module(module_you_desperately_need opencv some other module)' 更改为 'ocv_define_module(module_you_desperately_need opencv some other module WRAP java)'

    • 注意 1:这一步可能没有用,因为 WRAP java 可能已经写入文件中。
    • 注2:如果也写了“python”,没关系,你就让它写在原来的地方。
  • 在 CMakeLists.txt 中,添加:

    1. 以下两行位于“add_library”块之后和“find_library”块之前:

       include_directories(../opencv_src/opencv/platforms/build_android_armn/install/sdk/native/jni/include)
       link_directories(../AndroidStudioProjects/cOCVn/app/src/main/jniLibs/armeabi-v7a)
      
      • 注意:这两行非常直接地给出了包含目录和链接目录的路径
    2. “find_library”块之后和“target_link_libraries”块之前的以下行:

       file(GLOB PARTYLIBS "../opencv_src/opencv/platforms/build_android_armn/install/sdk/native/3rdparty/libs/armeabi-v7a/*.a")
       file(GLOB CVLIBS  "../opencv_src/opencv/platforms/build_android_armn/install/sdk/native/libs/armeabi-v7a/*.a")
      
      • 注意:这些是为了更容易链接命令,请参阅下一点。
    3. 以下路径(按书面形式)位于“target_link_libraries”中,位于“native-lib”变量之后、“${log-lib}”之前:

       ${CVLIBS}
       ${PARTYLIBS}
       ${CVLIBS}
      
      • 注意:这是棘手的部分:由于循环依赖性,您必须编写 CVLIBS、PARTYLIBS,然后再次编写 CVLIBS,否则您将不会停止出现链接错误。到现在为止,一切都应该链接起来。
  • 在app的gradle.build中,添加以下代码:

         productFlavors {
             armv7 {
                 ndk {
                     abiFilter "armeabi-v7a"
                 }
             }
             fat
        }
    

    在 android 块的末尾

    • 注意:通过一劳永逸地指定arm架构,可以防止构建时出现mips64架构错误
  • 在native-lib.cpp中:

    1. 在'stringFromJNI'函数中尝试以下代码(这是在创建项目时由AS自动生成的)

       cv::Mat test;
       cv::VideoCapture camera;
       camera.open(0);
       cv::Ptrcv::aruco::Dictionary dict = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
       cv::Mat marker;
       cv::aruco::drawMarker(dict, 25, 200, marker, 1);
       std::string hello = "Hello from C++";
       return env-NewStringUTF(hello.c_str());
      
    2. 不要忘记以下内容:

       #include jni.h
       #include string
       #include opencv2/aruco.hpp
       #include opencv2/videoio.hpp
      
      • 注意:因为该字符串不是在函数结束之前生成的,所以您知道,当您测试时,如果该字符串确实显示在屏幕上,则该函数已经执行完毕,没有问题,并且您很好(因为上面提供的代码使用了一些截至 2016 年 8 月 12 日尚未稳定发布的模块(12 月 8 日,我以 dd/mm/yyyy 格式编写日期)。
  • 测试时间:

    1. 同步 gradle
    2. build
    3. 在arm设备上运行

你可以走了 \ o \\ O // o /

补充笔记 :

  • 所有 gradle.build 文件和 CMakeLists.txt 文件都可以在 AS 窗口左侧菜单中的 Android 视图中轻松找到。
  • 请记住,如果您在命令窗口中导航时遇到错误,那么您的“/”可能应该是“\”,或者反之亦然。 (“cd”命令用于在命令窗口中导航)。
  • 我在 Windows 10 上运行。
  • 如果您不太确定应该逐步在屏幕上看到什么,我在答案开头提到的教程应该可以让您很好地了解在创建 AS 项目之前应该看到什么。然后,您可以看一下本教程,其中解释了如何在正式版本的 Android Studio 项目中设置 OpenCV SDK。我提供的步骤与这两个教程都不同,但我把它们放在这里,因为它们可以帮助您了解屏幕/窗口应该是什么样子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建适用于 Android 的 OpenCV 并将其与 NDK 一起使用 的相关文章

  • 在包“android”中找不到属性“backgroundTint”的资源标识符

    我发现了一些视图 xml 属性 例如backgroundTint backgroundTintMode 但是当我使用它作为视图属性定义时 Eclipse 显示错误 No resource identifier found for attri
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 找不到 com.google.firebase:firebase-core:9.0.0 [重复]

    这个问题在这里已经有答案了 在遵循有些不一致的指示之后here https firebase google com docs admob android quick start name your project and here http
  • Android 后退按钮无法与 Flutter 选项卡内的导航器配合使用

    我需要在每个选项卡内有一个导航器 因此当我推送新的小部件时 选项卡栏会保留在屏幕上 代码运行得很好 但是 android 后退按钮正在关闭应用程序而不是运行 Navigator pop import package flutter mate
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL

随机推荐

  • esbuild 不捆绑文件

    我正在尝试使用 esbuild 在 npm 项目中捆绑和缩小我的文件 它正在最小化我传入的每个文件 但它不是捆绑 它给我一个错误 当有多个文件时我必须使用 outdir 然而 这让我恢复了所有这些文件 最小化后 放在一个文件夹中 这不是我想
  • 如何在 Chrome 打包应用程序中从 Web 视图中的链接打开新窗口

    为了显示来自横幅广告交换的广告 我正在加载一个包含链接到广告服务器的 iframe 的 Web 视图 通过一些 JavaScript 我可以将广告链接目标设置为 blank 以便广告将在单独的浏览器窗口中打开 否则它将在同一个小网络视图中打
  • UIBarButtonItem 与 UIButton 作为 CustomView - 从 UIButton 中,如何访问其中的 UIBarButtonItem?

    我有一个UIBarButtonItem with UIButton作为自定义视图 The UIButton has a addTarget action 在上面 在该操作中 我呈现了一个弹出窗口 我目前正在从sender frame the
  • 正则表达式模式可选字符[重复]

    这个问题在这里已经有答案了 我想匹配像 19740103 0379 或 197401030379 这样的字符串 即破折号是可选的 我如何使用正则表达式来实现这一点 通常你可以只使用 或者 您可以使用 0 1 但你应该发现 因为几乎所有地方都
  • 别名资源 (WPF)

    我试图在 XAML 中为资源添加别名 如下所示
  • 从电话号码中提取代码国家/地区 [libphonenumber]

    我有一个这样的字符串 33123456789 法国电话号码 我想在不知道国家 地区的情况下提取国家 地区代码 33 例如 如果我有另一部来自其他国家 地区的手机 它应该可以工作 我使用谷歌图书馆https code google com p
  • matlab中如何判断一个矩阵是否为空?

    在我的 matlab 程序中 我想在进一步操作之前确定变量或函数的输出是否为空 实际上 我已经编写了一个计算两条线段之间的交点的函数 如果没有交集 则函数不返回任何内容 因此函数分配的变量将为空矩阵 我知道我可以使用size功能 但有没有更
  • 有没有办法使用 javascript 检测元素所在的 CSS 网格列和行?

    有没有一种方法可以在 JavaScript 中动态检测 CSS 网格中元素所在的网格列和行 我有一个网格 我设置了三个断点 使其具有 4 3 或 2 列 我想要做的是 如果用户单击某个单元格 则将单元格中的新元素立即动态覆盖到被单击的单元格
  • 如何检测 jQuery 中新元素的创建?

    假设我有以下代码 它返回页面上锚元素的数量 function getLinkCount alert Links a length 如果我在文档准备好后调用它 它将按预期工作 但是 如果现在通过 Javascript 动态地将新链接插入到页面
  • 在 Android Studio 1.3+ 自动完成中隐藏 android.R 资源

    是否可以将Android Studio配置为仅显示 drawable里面的资源project folder 我正在做的项目是一个行业项目 很少需要我使用R资源 我不认为你实际上可以做到这一点 只有库开发人员可以选择将资源隐藏在他们的aar分
  • 函数不改变传递的指针 C++

    我有我的职责并且我正在充实targetBubble那里 但调用这个函数后它没有被填充 但我知道它被填充在这个函数中 因为我有输出代码 bool clickOnBubble sf Vector2i mousePos std vector
  • 对 PHP 的非阻塞 Ajax 请求

    我正在使用 PHP 从远程服务器下载一个 大 文件 并且通过单击网页上的下载按钮来触发此下载 所以当我点击download网页上的按钮 然后Ajax请求 有角度 http 被制作为 PHP 函数 该函数使用触发下载cURL 同时 我想使用
  • 如何在 PHP 中创建一个带有反斜杠的字符串? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我需要一个反斜杠作为字符串的一部分 我该怎么做 当反斜杠 不转义字符串的终止引号或以其他
  • 查找与给定条件匹配的元素的索引

    给定一个数组 如何找到与给定条件匹配的元素的所有索引 例如 如果我有 arr x o x o x 查找该项目所在的所有索引x 我可以做 arr each with index map a i a x i nil compact gt 0 2
  • 可以使用异常来检查数组边界吗?

    我想检查给定的坐标是否在数组内 public boolean checkBounds int x int y try Object val array x y return true catch ArrayIndexOutOfBoundsE
  • 将图像从 URL 加载到表视图单元格中的图像视图的更快方法

    我用它来加载 URL 到图像视图 let url NSURL string URL let data NSData contentsOfURL url self releasephoto image UIImage data data 但是
  • 检测当前 iPhone 输入语言

    有谁知道 我可以获得iPhone应用程序中当前的输入语言和 或键盘布局吗 输入语言更改时我还能收到通知吗 在 iOS 4 2 及更高版本中 您可以使用UITextInputMode类来确定当前用于文本输入的主要语 言 UITextInput
  • 使用 roxygen2 构建 R 包时出错

    我有 2 个文件 File R 和 Cpp File c Cpp File c 中的内容 include
  • 如何编写线程安全的自动化测试

    我有一个不是线程安全的类 class Foo Abstract base class code which is not thread safe 此外 如果您有 foo1 和 foo2 对象 则在 foo2 gt anotherFunc 返
  • 构建适用于 Android 的 OpenCV 并将其与 NDK 一起使用

    背景 我目前正在 Android Studio 上为 Moverio BT 200 增强现实眼镜开发一个应用程序 我正在使用 OpenCV 特别是该库的 arUco 模块 该模块必须与 NDK 一起使用 另外 它不在稳定版本中 所以我自己编