提问人:Boosil-guy 提问时间:11/16/2023 最后编辑:Boosil-guy 更新时间:11/16/2023 访问量:40
我构建了 OpenCV so 文件以在 Unity Android 中成功使用,但为什么我的应用程序找不到 Dll?
I built the OpenCV so file to be used in Unity Android successfully, but why can't my app find the Dll?
问:
我想使用 opencv-4.8.0-android sdk 编写所需的源代码,然后从 Unity Android 调用它。我的环境如下。
- Visual Studio 2022,在 win10 上运行
- android-ndk-r23c,还尝试使用与 Unity 编辑器 NDK 相同的 R21D
- Unity 2021.3.22、arm64(测试设备为 Galaxy S21+)
- Visual Studio 属性
- 常规
- 平台工具集:Clang 5.0
- 配置类型:*.so
- 目标 API 级别:android-21(与 unity api 级别相同)
- 使用 STL : LLVM libc++ c++_static (也尝试共享)
- C/C++
- 其他包含目录:opencv-4.8.0-android\sdk\native\jni\include
- 语言 : c++17(-std=c++1z)
- 连接
- 常规,其他库目录:opencv-4.8.0-android\sdk\native\libs\arm64-v8a
- 输入,其他依赖项:opencv-4.8.0-android\sdk\native\libs\arm64-v8a\libopencv_java4.so
- 常规
我编写了下面的代码并成功构建了so文件。
#include "OpenCVwithUnityAndroid.h"
#include "opencv2/core.hpp"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "TestSharedObject", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "TestSharedObject", __VA_ARGS__))
extern "C" {
const char* OpenCVwithUnityAndroid::getPlatformABI()
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
return "This native library is compiled with ABI: %s" ABI ".";
}
struct Color32
{
uchar red;
uchar green;
uchar blue;
uchar alpha;
};
void OpenCVwithUnityAndroid::FlipImage(Color32** rawImage1, int width1, int height1) {
using namespace cv;
Mat Image(height1, width1, CV_8UC4, *rawImage1);
flip(Image, Image, -1);
}
}
构建的 libOpenCVwithUnityAndroid.so 文件已移至 Unity 的 plugins/android 目录。 目标架构是 ARM64,APK 是使用 IL2CPP 构建的。 但是,当我在测试环境中运行它时,我得到一个 DllNotFoundException。
在相同的环境中,在不导入 OpenCV 的情况下创建 so 文件后,我在调用 getPlatformABI() 时能够毫无问题地检查日志。
在完成所有这些操作之前,我在 Windows 环境中创建了一个 DLL,并在 Unity 中调用 FilpImage() 函数时确认图像被翻转。但是,我不知道Android环境中的问题是什么。
答: 暂无答案
评论