gpt4 book ai didi

android - 为Android构建OpenCV并将其与NDK结合使用

转载 作者:行者123 更新时间:2023-12-02 15:14:53 25 4
gpt4 key购买 nike

上下文:我目前正在Android Studio上为Moverio BT 200增强现实眼镜开发一个应用程序。我正在使用OpenCV,尤其是库的arUco模块。该模块必须与NDK一起使用。另外,它不在稳定版本中,因此我自己编译了该库(使用本指南:https://zami0xzami.wordpress.com/2016/03/17/building-opencv-for-android-from-source/)。图书馆的 build 进展顺利。之后,我做了一个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");
}
}

在构建时确实已加载该库。

现在出现了问题:当我尝试在本机代码(这是我的native-lib.cpp)中实际使用arUco模块时:
#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自动生成的,我找不到将其传递到的文件。我相信,只要能找到它,我就可以为手臂(这就是我想要的)而建造,而不是笨拙。问题是,我找不到它。 (而且我什至不确定这确实是我想要的东西。我只是想让我的项目适合我的眼镜。)

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

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

要么
#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中


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

要么
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体系结构构建我的项目?

最佳答案

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

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

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

使用WINDOWS10中的ANDROID的源代码交叉编译OPENCV

*首先:先决条件*
  • 下载OpenCV并解压缩(例如在“../opencv-source”中)
  • 下载OpenCV额外模块并解压缩(例如在“../opencv-contrib-source”中)
  • 下载Android NDK(例如在“../ndk-dir”处)
  • 下载CMake(例如“../cmake-dir”)和MinGW(例如“../mingw-dir”)
  • 安装Android Studio

  • * SECOND:使用CMake配置*
  • 转到“../opencv-source/platforms”并创建一个名为“build_android_arm”的文件夹
  • 在CMake中的
  • 中,使用以下路径填充以下前两个字段:
  • 源代码在哪里:'../opencv-source'
  • 在哪里生成二进制文件:'../opencv-source/platforms/build_android_arm'
  • 通过“添加条目”添加以下选项:
  • ANDROID_NDK,键入“路径”,值“../ndk-dir”
  • ANDROID_NDK_HOST_X64,输入“bool”,值为1
  • CMAKE_TOOLCHAIN_FILE,键入“路径”,值“../opencv-source/platforms/android/android.toolchain.cmake”
  • 按“配置”
  • 选择'MinGW Makefiles'作为编译器
  • 选择“指定用于交叉编译的工具链文件”
  • 按“下一步”,然后按“完成”
  • 注意1:只要没有错误消息,一切就很好。不必担心警告消息(例如CMake告诉您您正在使用已弃用的东西)。
  • 注2:如果您无法在该步骤进行配置,请尝试阅读以下几点,这可能会有所帮助。
  • 通过“搜索”字段更改以下附加选项:
  • EXTRA_MODULE_PATH,键入“路径”,值“../opencv-contrib-source/modules”
  • WITH_CAROTENE,输入“bool”,值0
  • BUILD_ZLIB,输入“bool”,值1
  • 注意:您必须在此步骤之前进行一次配置,因为之前创建的变量已重新分组在“未分组的条目”组下,而以下变量是CMake自动生成的变量,需要将其分组在正确的组中(即不是“未分组的条目”)。
  • 验证是否正确设置了以下选项(通过“搜索”字段):
  • ANDROID_NDK_HOST_X64,输入“bool”,值为1
  • CMAKE_MAKE_PROGRAM,键入“路径”,值“../mingw-dir/bin/mingw32-make.exe”。这个选项,我实际上在CMake配置中没有。如果按“配置”时,它不起作用且没有此选项,则应尝试添加它(但我不知道如何)。如果按“配置”时没有任何问题,请不要理会该变量。此检查来自上面链接的原始教程。
  • CMAKE_TOOLCHAIN_FILE,键入“路径”,值“../opencv-source/platforms/android/android.toolchain.cmake”
  • 按“配置”
  • 选择'MinGW Makefiles'作为编译器
  • 选择“指定用于交叉编译的工具链文件”
  • 按“下一步”,然后单击“完成”
  • 按“生成”

  • * THIRD:使用mingw编译*
  • 转到'../mingw-dir/msys/1.0'并运行'msys'bash文件
  • 导航到'../opencv-source/platforms/android_arm'
  • 运行'mingw32-make'命令
  • 运行'mingw32-make install'命令

  • *第四名:android项目*
  • 启动Android Studio并创建一个新项目:
  • 选择文件->新建->新建项目...
  • 用“cOCV”填充“应用程序名称”
  • 选中“包括C++支持”框
  • 单击“下一步”
  • 选择您的最小SDK(假设API 14:Android 4.0(IceCreamSandwich)
  • 单击“下一步”,“下一步”和“完成”
  • 转到文件->新建->导入模块...
  • 提供'../opencv-source/platforms/android_arm/install/sdk/java'
  • 单击“下一步”并“完成”
  • 更改openCVLibraryXXX(导入的模块)文件夹中build.gradle文件中的目标:
  • compileSdkVersion和targetSdkVersion应该相同,大于或等于23
  • minSdkVersioon应该与创建项目
  • 时指定的名称相同
    openCVLibraryXXX(导入的模块)文件夹中的build.gradle文件中的
  • :
  • 将'apply plugin:com.android.application'替换为'apply plugin:com.android.library'
  • 删除“applicationId“org.opencv”行
  • 注意:完成最后一步是为了避免出现以下错误:“在项目应用程序上未指定将解析为不支持作为编译依赖项的APK存档”。
  • 将导入的库作为依赖项添加到File->'Project Structure'
  • 中的“app”模块
  • 在'app / src / main'中创建一个jniLibs文件夹:
  • 在左侧菜单
  • 的Android View 中右键单击“应用”
  • 单击“New-Folder-JNI文件夹”
  • 检查“更改文件夹位置”
  • 将“目标源集”设置为“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一些其他模块)'为'ocv_define_module(module_you_desperately_need OPENAP)其他模块
  • 注1:此步骤可能没有用,因为WRAP java可能已写入文件中。
  • 注2:如果也写了“python”,那就没问题,您可以将它写在原处。
  • 在CMakeLists.txt中添加
  • ,添加:
  • 在'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)
  • 注意:这两行非常简单地给出了include和link目录的路径
  • 在“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")
  • 注意:这些是为了更轻松地链接命令,请参阅下一点。
  • 在“target_link_libraries”中,在“native-lib”变量之后,在“$ {log-lib}”之前的以下路径,按原样:
     ${CVLIBS}
    ${PARTYLIBS}
    ${CVLIBS}
  • 注意:这是棘手的部分:由于周期性的依赖性,您必须再次编写CVLIBS,PARTYLIBS和CVLIBS,否则您将不会再遇到链接错误。到现在为止,所有内容都应该链接在一起。
  • 在应用程序的gradle.build中的
  • 中,添加以下代码:
         productFlavors {
    armv7 {
    ndk {
    abiFilter "armeabi-v7a"
    }
    }
    fat
    }

    在android块的末尾
  • 注意:通过一劳永逸地指定arm体系结构
  • ,这可以防止在构建mips64体系结构时出错
    native-lib.cpp中的
  • :
  • 在'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());
  • 不要忘记以下内容:
     #include jni.h
    #include string
    #include opencv2/aruco.hpp
    #include opencv2/videoio.hpp
  • 注意:因为字符串不是在函数结束之前生成的,所以在测试时,您知道如果确实在屏幕上显示了该字符串,则该函数已经通过了毫无问题,并且您很好(因为上面提供的代码使用的某些模块截至2016年12月8日(在12月8日,我以dd / mm / yyyy格式编写的日期)尚未处于稳定状态。
  • 测试时间:
  • 同步gradle
  • 构建
  • 在手臂设备上运行

  • 你很高兴去\ o \\ O // o /

    补充说明 :
  • 所有gradle.build文件和CMakeLists.txt文件都可以在AS窗口左侧菜单中的Android View上轻松找到。
  • 请记住,如果您在命令窗口中导航时遇到错误,也许您的'/'应该是'\'或相反。 (“cd”命令可在命令窗口中导航)。
  • 我在Windows10上运行。
  • 如果您不太确定应该逐步在屏幕上看到什么,那么我在答案开头提到的教程应该可以使您很好地了解在创建AS项目之前应该看到的内容。然后,您可以看看this tutorial,它解释了如何在Android Studio项目中为官方发布设置OpenCV SDK。我提供的步骤与这两个教程都不相同,但我将它们放在此处,因为它们可以帮助您了解屏幕/窗口的外观。
  • 关于android - 为Android构建OpenCV并将其与NDK结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40948953/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com