3

我正在尝试在 Unity3D pro 中使用一些 C 代码。

我的基本方法是(1)将 C 源代码构建到静态库中(2)创建一个空包并链接到库(3)将包导入 Unity 3D pro(作为插件)。

我基本上是按照这个教程

它已经为我工作了一段时间,直到最近当我更新我的 C 代码并重新编译和重建库和包时,一切都出错了......

当我第一次导入包时,我得到了一个DllNotFoundException

在那个阶段,我的捆绑项目只是一堆库——从我的源代码(这是一个 .a 文件)构建的库和我认为 .a 库依赖的一些其他库(其他库具有 .dylib 扩展名)。

我在包中添加了一个 test.c 文件。测试 .c 文件仅包含两行:

#include <stdio.h>
#include "ccn.h"

char* say()
{
    return "hi";
}

其中 ccn.h 是我的 C 源代码中的头文件。

重新构建捆绑包后,DllNotFoundExeption消失了,但我得到了一个EntryPointNotFoundException

这是我的想法:

  1. 因为 Xcode 非常智能,我猜测在添加简单的 test.c 文件时,Xcode 为我修改了一些捆绑设置。我相信这就是为什么 DllNotFoundException 首先消失的原因。我想对了吗?
  2. 我认为要解决 EntryPointNotFound 问题,我还必须修改一些捆绑项目设置 - 但我不知道如何......请帮助我......

非常感谢!

编辑

  1. 我看到这个线程表明,由于 Xcode 使用 g++ 进行编译,即使我的非托管代码是纯 C 语言,我也需要 extern "C"。我在 Xcode4 中将目标设置更改为“ Compiler for C/C++/Objective-C ”从Apple LLVM 3.0LLVM GCC 4.2,但我仍然遇到同样的异常。
  2. 我还看到了这个 mono 文档,它说 mono 正在使用GLib加载库,而 Glib 在 Mac OS X 上存在一个错误,即它无法识别 .dylib 库。我删除了 .dylib 库并再次尝试,但直到遇到同样的异常。
  3. Apple 的文档还说,每个可加载包都必须有一个主体类,如果用户没有指定哪个类是主体类,NSBundle 将使用 Xcode 项目中显示的第一个类作为主体类。好吧,我猜我创建的包是一个可加载包,但是因为它只是一个用 C 构建的静态库,它实际上没有任何类。当我查看项目的info.plist时,主体类条目只是空的。这可能是问题吗?如果是这样,我该如何解决?
  4. 我还在 Apple 的文档中看到了一些我不太理解的内容:

    如果您的可加载包是一个插件,宿主应用程序开发人员通常会为框架中的插件架构提供一个接口。该框架通常包含一个所有插件主体类都继承自的类,或插件主体类采用的协议(正式或非正式)。

    我很确定我创建的可加载包是一个插件。我正在将包导入 Unity3D。这是否意味着我应该从 Unity 定义一个主体类?如何?

4

1 回答 1

2

这个问题有一个简单的解决方案:

首先尝试在 test.c 文件中为您提供 EntryPointNotFoundException 的任何函数。

通过“试用”我的意思是,在你的 main() 中调用该函数并首先在 C 中对其进行测试。

在我的例子中,抛出 EntryPointNotFoundException 的函数称为 ccn_run()。所以我做了以下事情:

  1. 向 test.c 添加一个 main() 函数
  2. 在 main() 函数中键入 ccn_run()
  3. 在 Xcode 项目中添加命令行目标并进行测试

我试过了,该函数在 C 中工作正常,现在神奇的是,当我重建包时(不删除 main() 函数和其中的 ccn_run() 调用),Unity 可以调用 ccn_run() 函数没有问题!

我无法解释为什么这可以解决我的问题,但这已经为我工作了将近一个月。不久前 Xcode 升级到 4.3.2,我再次尝试了同样的方法,仍然有效。我想也许添加一个 main() 函数有助于定义入口点?

最后,我记录了将 C 代码导入 Unity 的整个过程,很高兴在这里分享:https ://docs.google.com/document/d/1vAeupNQlBTY3y3Bma5Jo_Hs4JRYm6FoEc4vQN0WBGNg/edit

我的代码示例:

  1. Xcode 项目:https ://github.com/CherryQu921/CCNxPlugin
  2. 统一项目:https ://github.com/CherryQu921/cqs

希望这个答案,尤其是我的教程有帮助!

于 2012-04-28T22:16:21.993 回答