所以我终于设法让它工作了!!!!!!!!!! =)
我在这里发布它对我有用的方式。所以我设法做的是使用 Visual Studio 构建一个带有 OpenCV 链接的 .so C++ 库。在 Unity 中导入这个库,并在 .so 库中定义一个非常简单的 Android 应用程序调用函数。在 Android 手机上运行该应用。
使用的配置:
- Unity 2017.2.0f2
- Visual Studio 2017
- 适用于 Android 的 OpenCV 3.3.1。 opencv-3.3.1-android-sdk.zip 可从OpenCV website 下载。
- Android 智能手机:在 Lenovo Phab 2 Pro(Google Tango Phone)和 HTC 10 上测试
请注意,我将描述的步骤对我有用,但如果您的 Android 设备上有不同的 CPU,对您来说可能会有所不同(例如,您必须为 ARM64 而不是 ARM 构建,但事实是这些步骤只是一个示例)。
我假设您已经在您的计算机上安装了 Android SDK、NDK 和 Unity,因此您已经能够使用 Unity 构建 Android 应用程序。
第 1 步:使用 Visual Studio 2017 创建 C++ Android 库。
从左侧的下拉菜单中转到模板 > Visual C++ > 跨平台 > Android,然后选择“动态共享库 (Android)”。 (您可能必须安装能够使用 VS2017 为 Android 构建的 VS 工具)。我将为此示例保留默认的“SharedObject1”名称。
在“解决方案平台”(调试/发布下拉菜单旁边)中选择“ARM”。我建议你在发布版本中构建,但在这里我们将坚持调试,因为工作流程完全相同。
第 2 步:将此 C++ Android 项目与适用于 Android 的 OpenCV 链接。
- 解压 opencv-3.3.1-android-sdk.zip 到任何你想要的地方(选择并记住这个地方,因为你需要把文件保存在这个地方)。您应该有一个包含 3 个子文件夹的文件夹,分别称为“apk”、“samples”和“sdk”。
- 在 Visual Studio 中,转到项目 > SharedObject1 属性。在配置中选择“所有配置”(因此它适用于调试和发布),平台选择“ARM”。然后:
- 在 C/C++ 下,将 OpenCV 包含的完整路径添加到“其他包含目录”。这个路径是:C:\Path-to-OpenCV-android-sdk\sdk\native\jni\include。
- 在 Linker > General 下,将 OpenCV 库的完整路径添加到“Additional Library Directories”。这个路径是:C:\Path-to-OpenCV-android-sdk\sdk\native\libs\armeabi-v7a。
- 在 Linker > Input 下,将 OpenCV 库文件的完整路径添加到“Additional Dependencies”。这个路径是:C:\Path-to-OpenCV-android-sdk\sdk\native\libs\armeabi-v7a\libopencv_java3.so。
请注意,如果您知道如何设置环境变量,则可以使用环境变量来代替完整路径。这里就不解释了。
第 3 步:是时候为我们的库编写一些 C++/OpenCV 代码并构建它了
ShareObject1.h
extern "C"
{
namespace SharedObject1
{
float Foopluginmethod();
}
}
ShareObject1.cpp
#include "SharedObject1.h"
#include <opencv2\core.hpp> // use OpenCV in this C++ Android Library
extern "C"
{
float SharedObject1::Foopluginmethod()
{
cv::Mat img(10,10,CV_8UC1); // use some OpenCV objects
return img.rows * 1.0f; // should return 10.0f
}
}
然后构建库:构建 > 构建解决方案。如果您在此处遇到“找不到文件 blablabla”之类的错误,请检查您是否将完整路径放入 STEP 2 或检查您的环境变量。如果还有其他错误不知道,在cmets中询问。
这应该在 Path-to-your-VS-Project\SharedObject1\ARM\Debug(或 Release)下生成了一个 libSharedObject1.so 文件。
第 4 步:让我们使用 Unity
- 创建一个新的 Unity 项目并根据需要为其命名。
- 创建一个新场景并保存。
- 文件 > 构建设置。在平台下选择 Android 并点击“切换平台”。
- 单击播放器设置。在“其他设置”下,将包名称更改为您现在的感觉(Unity 不喜欢默认值)。为设备过滤器选择“ARMv7”。
- 将您的场景添加到构建中。
在您的场景中,选择主摄像机并向其添加一个名为“CallNativeCode”的新 C# 脚本:“添加组件”> 键入“CallNativeCode”> 新脚本> 创建并添加。在检查器中,在 Clear Flags 中选择“纯色”并放置一个深色(这只是为了快速演示)。
CallNativeCode.cs
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class CallNativeCode : MonoBehaviour
{
[DllImport("SharedObject1")]
private static extern float Foopluginmethod();
void OnGUI ()
{
// This Line should display "Foopluginmethod: 10"
GUI.Label(new Rect(15, 125, 450, 100), "Foopluginmethod: " + Foopluginmethod());
}
}
在 Assets 文件夹下,创建一个名为“Plugins”的子文件夹(拼写很重要),并在 Plugins 下创建一个名为“Android”的子文件夹。在此文件夹中,复制文件 libSharedObject1.so 和 libopencv_java3.so(这两个文件的路径在步骤 2 和步骤 3 中)。所以你应该有类似的东西:
在 Unity Editor 中选择 libSharedObject1.so 并检查检查器中的 Selected plaforms for plugin 是否仅检查了 Android,并且 CPU 是 ARMv7。对 libopencv_java3.so 执行相同操作。
现在您可以在手机上构建和运行您的应用,尽情享受吧! ;-)
所以这只是一个虚拟应用程序,但它显示了正确的短语,它可以工作!!! =) 这意味着我们设法让我们的 Android Unity 应用程序调用 OpenCV C++ 代码。关于更复杂的 OpenCV C++ 代码,好吧,这不是这里的主题,是时候让你的创造力发挥出来了。