OpenCV for Android 通过 Visual Studio 到 Unity

问题描述

我尝试使用 Visual Studio 2019 和 OpenCV Android 编译一个 .so 库,以便在 Unity 中使用这个库。 有一些关于如何配置 Visual Studio 以使用 OpenCV Android(herehere)的答案,但这些都不适合我。下面你可以看到我的配置。

Visual Studio 2019(在 Windows 10 上运行)

android-ndk-r21e // 也尝试过 android-ndk-r15c android-ndk-r16b 和 android-ndk-r17c

OpenCV Android 4.5.2 // 也尝试过 OpenCV Android 4.0.0、4.0.1 和 4.1.0

我在 Visual Studio 2019 中的设置如下所示:

配置属性

- 一般

  • 平台工具集 Clang 5.0(也尝试过 Clang 3.8 或 GCC 4.9)

  • 配置类型动态库 (.so)

  • 目标 API 级别 Nougat 7.0 (android-24)(也尝试了不同的版本)

  • 使用 STL LLVM libc++ 静态库(c++_static)(也试过“GNU STL 静态库(gnustl_static)”)

C/C++

- 一般

  • 其他包含目录“OpenCV_4_5_2_Android\sdk\native\jni\include 的路径”

  • 代码生成启用 C++ 异常“Yes(-fexceptions)”

  • 语言 C++17(-std=c++1z)

  • 预编译头不使用预编译头

链接

- 一般

  • 其他库目录OpenCV_4_5_2_Android\sdk\native\libs\armeabi-v7a的路径

-输入

  • 其他依赖项OpenCV_4_5_2_Android\sdk\native\libs\armeabi-v7a\libopencv_java4.so的路径

我尝试编译的 Source.cpp 只是一个用于测试目的的函数

#include <opencv2/core.hpp>
extern "C" float test(float a,float b)
{float c = a * b;   return c;}

这给了我以下错误

E0035 #error 指令:此构造函数尚未移植到此平台
E0020 标识符“__fp16”未定义
使用未声明的标识符“ANDROID_LOG_INFO”

当我在引发此错误文件顶部添加 ANDROID_LOG_INFO 时,可以修复 #include "android/log.h" 错误。但另外两个错误仍然存​​在。

解决方法

我遇到了与您完全相同的问题(尽管我使用的是 c++ 11),并且设置完全相同,并且挣扎了好几天。我相信你看到的错误(像我一样)来自 arm_neon.h。非常奇怪的是,我能够成功地构建(而不是运行).so,即使有这些错误(我说“错误”是因为如果你查看 arm_neon.h,其他人会弹出),所以试试吧。也许这是某种 IntelliJ/Intellisense 错误,而不是其他任何工具链设置中的漏报。

同时,我不能 100% 确定我总是能够解决这个问题,所以如果你不能,也尝试这些步骤:

  1. 将 OpenCV 4.0.1 与 Android NDK 16rb 结合使用。 NDK 在 OpenCV 构建方面很重要,这是我所知道的唯一假设匹配。
  2. 从头开始学习本教程:https://amin-ahmadi.com/2019/06/03/how-to-use-opencv-in-unity-for-android/
  3. 如果下载的 OpenCV android SDK 仍然有问题,请使用此处的其他教程从源代码构建 OpenCV:https://amin-ahmadi.com/2019/02/03/how-to-build-opencv-4-x-for-native-android-development/ 然后重复第 2 步。

主要编辑: OpenCV 4.5.2 需要区别对待,因为它不再使用带有 gnu c++ 的工具链。 - 从 CMake 构建 OpenCV 时,使用 Android NDK 21e 构建,不要使用 OpenCV 4.5.2 中的工具链。使用 Android NDK 的构建文件夹 (android-ndk-r21e\build\cmake) 中的那个。 - 从 Visual Studio 2019 构建 .so 时,不要使用 GNU STL,使用 LLVM。 GNU c++ 不再是 Android NDK 的一部分,您需要将其完全排除在流程之外。 - 在链接器输入中,将您的库文件(或文件,如果它只是世界上的文件)的名称放在库依赖项字段中,而不是在附加依赖项字段中。 - 其他一切都与那些常见教程中的相同。