2

我正在尝试使用我的 MonoTouch 应用程序访问的一些本机代码函数制作一个 DLL。我遵循了 monotouch-bindings 使用的一般方法,您可以在其中:

  • 制作一个 xcode 项目并将一些本机代码放入其中
  • 使用 xcodebuild 构建静态库(.a 文件)
  • 使用 --link-with 运行 btouch 以生成 .dll 文件
  • 在我的 MonoTouch 应用程序中添加对 .dll 文件的引用

.. 但是每当我尝试在我的应用程序中使用这些功能时,我都会得到 System.EntryPointNotFoundException。这是我正在尝试做的每件事的代码:

在 .cpp 文件中:

extern "C" {
   int SomeFunction();
}

int SomeFunction() {
   ...
}

用于构建 .a 文件的命令行

xcodebuild -project MyStaticLibrary.xcodeproj -target MyStaticLibrary -sdk iphonesimulator -configuration Release clean build

带有绑定的 .cs 文件 (NativeBindings.cs)

public class MyStaticLibraryBindings
{
    [ DllImport( "__Internal" ) ]   public extern static int SomeFunction();
}

DLL 的 AssemblyInfo.cs

using System;
using MonoTouch.ObjCRuntime;

[assembly: LinkWith ("libMyStaticLibrary.a", LinkTarget.Simulator | LinkTarget.ArmV7 | LinkTarget.ArmV7s, IsCxx = true, ForceLoad = true, Frameworks = "", WeakFrameworks = "")]

构建 .dll 的命令行

btouch -x=NativeBindings.cs AssemblyInfo.cs --out=NativeBindings.dll --link-with=libMyStaticLibrary.a,libMyStaticLibrary.a

.. DLL 构建良好,我的应用程序在编译期间看到 MyStaticLibraryBindings.SomeFunction 函数,但在运行时调用它时,我得到 System.EntryPointNotFoundException。

我已经验证 libMyStaticLibrary.a确实包含 SomeFunction:

~/build> nm libMyStaticLibrary.a*
00000167 T _SomeFunction
4

2 回答 2

2

此外,在您的库中找到的符号是_SomeFunction在您尝试 P/Invoke 时SomeFunction。在某些情况下,只有使用正确的前缀才能进行绑定

于 2013-03-05T08:32:48.150 回答
1

如果问题发生在设备上,那是因为您正在为模拟器构建本机库,而您正在为 armv7、armv7s 和模拟器构建 dll。您需要构建本机库 3 次,对于每个目标架构一次,将它们一起 lipo:

lipo -create -output libMyStaticLibrary.a libMyStaticLibrary-armv7.a libMyStaticLibrary-armv7s.a libMyStaticLibrary-simulator.a
于 2013-03-05T08:19:41.213 回答