【发布时间】: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