我构建了 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?

提问人:Boosil-guy 提问时间:11/16/2023 最后编辑:Boosil-guy 更新时间:11/16/2023 访问量:40

问:

我想使用 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环境中的问题是什么。

C# 安卓 C++ unity-游戏引擎 opencv

评论


答: 暂无答案