【问题标题】:Why does Unity fail to load android native libraries when linked against OpenCV?为什么 Unity 在与 OpenCV 链接时无法加载 android 本机库?
【发布时间】:2015-03-13 16:19:19
【问题描述】:

标题说明了一切。我正在使用 NDK 构建一个用于 Unity(游戏引擎,而不是 Ubuntu shell)的本机库。我已经准备好很多代码,它可以在运行 Android 4.4.4 的 Xperia Z Ultra 上运行。然而,最近我将这个应用程序发送给其他一些人在他们的手机上进行测试,但它在他们的手机上都不起作用。他们使用的是 Android 4.0 和 4.1,所以我尝试在我自己的 Android 4.0.4 设备(旧的 Xperia Mini Pro)上运行该应用程序并遇到了同样的问题。在缩小范围之后,我发现问题的根源在于构建中包含 OpenCV,即使它根本没有被引用。

这是我现在拥有的代码。首先,你见过的最简单的 CPP 文件:

//Test.cpp:
extern "C"
{
    int Test(int a, int b)
    {
        return a + b;
    }
}

请注意,它甚至不包含来自 OpenCV 的任何内容。 makefile(或在 NDK 上下文中调用的任何名称,我主要是 Windows/Visual Studio 人员)是:

#Android.mk:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#---------------------------
#note: if I comment these lines out, the library works just fine.
#if I don't, it won't load at all.
#---------------------------
OPENCV_PACKAGE_DIR := D:\Eclipse\OpenCVAndroid\OpenCV-2.4.9-android-sdk
include $(OPENCV_PACKAGE_DIR)/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := Test
LOCAL_SRC_FILES := Test.cpp

include $(BUILD_SHARED_LIBRARY)

构建这个项目会给我一个“libTest.so”文件。我把它放到我的 Unity 项目中,在 Assets/Plugins/Android/ (我也试过把它放到 Plugins/Android/libs/armeabi-v7a/ 中,没有运气)。我在 unity 中也有一个调用库的脚本:

//TestNative.cs:
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class TestNative : MonoBehaviour
{
    [DllImport("Test")]
    public static extern int Test(int a, int b);

    void OnGUI()
    {
        try
        {
            GUI.Label(new Rect(0, 0, 100, 100), "2 + 3 = " + Test(2, 3));
        }
        catch (System.Exception e)
        {
            GUI.Label(new Rect(0, 0, 600, 400), e.GetType().ToString() + " " + e.Message + "\n" + e.StackTrace);
        }
    }
}

当我在我的 Z Ultra 上运行它时,它运行良好。当我在 Mini Pro 上运行它时,它失败并出现异常“DllNotFoundException:Test”。我检查了 logcat 是否有错误,这就是它所说的:

01-06 06:46:27.660: D/dalvikvm(11135): Trying to load lib /mnt/asec/com.cet.sna2-2/lib/libTest.so 0x2bb86638
01-06 06:46:27.660: D/dalvikvm(11135): Trying to load lib /mnt/asec/com.cet.sna2-2/lib/libTest.so 0x2bb86638
01-06 06:46:27.660: E/Unity(11135): Unable to find Test

它什么也没说,它只是失败了。它适用于 4.4.4 的事实让我认为它可能与构建配置或类似的东西有关,但我无法弄清楚它是什么。有任何想法吗?谢谢。

【问题讨论】:

    标签: android c++ opencv unity3d android-ndk


    【解决方案1】:

    经过多次试验和错误后,我发现错误的原因是 Android 以某种方式设法弄乱了库依赖项。解决方法是使用 LoadLibrary 按照依赖项的特定顺序手动加载库。这可以在 Unity 中使用 AndroidJavaClass 来完成,以避免编写整个 jar 库来加载原生的。

    【讨论】:

      【解决方案2】:

      您必须构建一个与您正在使用的设备的架构相对应的 .so。 你应该看看这个链接: https://developer.nvidia.com/AndroidWorks 它提供了使用 Visual Studio 在 Android 上开发的有用工具 您可以轻松配置与您需要的架构相对应的 Android 动态库 (.so) :)

      【讨论】:

      • 嗯,实际上,它不是那样的,因为当时 Unity 甚至不支持除 ARM7 之外的任何东西。原因请参见我自己的答案。
      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多