【问题标题】:MonoMac / Xamarin.Mac binding simple dylib not workingMonoMac / Xamarin.Mac 绑定简单 dylib 不起作用
【发布时间】:2013-02-25 17:50:12
【问题描述】:

我正在尝试绑定一些本机代码以在 MonoMac / Xamarin.Mac 中使用,但我不确定我哪里出错了。我创建了一个简单的 dylib 来测试:

nativelibrary.h

- (NSString *)echo:(NSString *)message;

我知道我的库很好,因为我引用它并在 Objective-C / Cocoa 应用程序中使用它。

接下来,我尝试使用 parse.exe 生成初始绑定文件:

mono parse.exe [path...]/nativelibrary.h 

问题 #1 根据 Miguel 的guide 没有生成“gen.cs”文件

问题 #2 Parse.exe 实际上确实向控制台输出了一些东西,尽管它缺少我唯一的方法?

[BaseType (typeof (NSObject))]
interface nativelibrary {
}

不管怎样,我还是自己做gen.cs文件,手动填写缺失的方法:

gen.cs

using MonoMac.Foundation;

namespace ManagedConsumer
{
    [BaseType (typeof (NSObject))]
    interface Binding 
    {
        [Export ("echo:")]
        string Echo(string message);

        // I also tried like this:
        // NSString Echo(NSString message);
    }
}

接下来,我尝试使用 bmac.exe 创建绑定 DLL:

mono bmac.exe -o="dynamiclibrary.dll" -d="MONOMAC" -r="System.Drawing" -v [path].../gen.cs 

这会生成一个我在 MonoMac 项目中引用的 .dll。

最后,我将 .dylib 本身添加到我的 MonoMac 项目中,并指定“内容”构建操作。我确认 .dylib 已复制到我的包的“资源”目录中。

我可以实例化我的绑定对象的实例没问题:

Binding b = new Binding();
Console.WriteLine(b.ToString());

问题 3 但是,尝试调用我的方法:

Binding b = new Binding();
var result = b.Echo((NSString)"Hello, world");

导致非托管崩溃:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000000bf74bffc

我在另一个question 中看到,我们需要强制加载.dylib。所以我尝试在调用 Application.Init() 之前将这一行插入到我的 main.cs 中:

Dlfcn.dlopen ("nativelibrary.dylib", 0);

但我遇到了同样的崩溃。由于对 dlopen 的调用返回 0 而不是有效指针,因此我认为问题在于加载我的动态库。我也尝试使用属性:

[assembly:MonoMac.RequiredFramework("nativelibrary.dylib")]

但这只会吸引我:

System.Exception: Unable to load required framework: 'nativelibrary.dylib'

我做错了什么?

【问题讨论】:

    标签: mono monomac xamarin.mac


    【解决方案1】:

    经过大量的反复试验,我能够完成这项工作。两个变化:

    在我的自制 gen.cs 文件中,接口名称需要与我的原生类的名称相匹配,即

    nativelibrary.h

    @interface nativelibrary : NSObject
    
    - (NSString *)echo:(NSString *)message;
    

    gen.cs

    使用 MonoMac.Foundation;

    namespace ManagedConsumer
    {
        [BaseType (typeof (NSObject))]
        interface nativelibrary 
        {
            [Export ("echo:")]
            string Echo(string message);
        }
    }
    

    其次,我的原生库本身似乎有些问题,这意味着它无法用 dlopen 打开。我认为问题在于 XCode 'library' 项目默认为 x64,而且似乎只有 x86 可以工作。

    我改为从命令行编译它,如下所示:

    gcc -arch i386 -framework Cocoa -o nativelibrary.o  -c [path...]/nativelibrary.m 
    

    然后建立我的图书馆:

    libtool -dynamic -flat_namespace -lSystem -undefined suppress -macosx_version_min 10.6 -install_name $CURRENT_DIR/nativelibrary.dylib -o nativelibrary.dylib nativelibrary.o 
    

    现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多