XCode静态lib和monotouch绑定

时间:2011-12-28 09:29:26

标签: c# objective-c ios binding xamarin.ios

我在xcode中只有一个简单的静态库 test.h:

@interface TestClass : NSObject {
    NSString *SomeString;
}
@property(nonatomic, readwrite, copy) NSString *SomeString;
- (NSString *) getString;
- (int) getInt;
@end

test.m:

@implementation TestClass

@synthesize SomeString;

- (id)init
{
    if ((self = [super init]) == nil)
        return nil;

    SomeString = @"test string value";
    return self;
}

- (NSString *) getString {
    return @"Lorem ipsum dolor sit amet";
}
- (int) getInt {
    return 123;
}

@end

我从btouch生成的dll中复制了TstClass。如果我使用原始dll的实现:

[Register ("TestClass", true)]
public class TstClass : NSObject

变量Handle,ClassHandle等是空值,但app运行并返回null作为getInt,getString和SomeString。如果我将定义更改为

[Register ("TestClass")]
public class TstClass : NSObject

内部变量有效(意味着不为空),但当我试图调用TstClass的函数时,应用程序崩溃,没有输出。

在我的研究过程中,我发现有人通过在XCode构建设置中取消选中“拇指”选项来修复此问题,但我在xcode项目中找不到任何看起来像拇指的东西。 (以防万一:XCode 4.2构建4C199;我正在使用Monotouch的最新版本)

如何在xcode中创建静态库并将其与monotouch一起使用?我的代码出了什么问题?

和最后一个问题:我有一个.a及其.h文件。是否有更简单的方法从库和头文件生成绑定?

2 个答案:

答案 0 :(得分:2)

绑定库的最简单方法是使用绑定生成器(这是“btouch”工具,它是MonoTouch的一部分):

详细文件在这里:

http://docs.xamarin.com/ios/advanced_topics/binding_objective-c_types

您的变量为null的原因是您没有正确初始化库(在这种情况下,ClassHandle是一个应该从Class.GetHandle(“ClassName”)返回返回值的虚方法)。

将以下合同文件与btouch一起使用以生成正确的绑定:

 using MonoTouch.Foundation;
 using MonoTouch.ObjCRuntime;

 namespace AlexD {
     [BaseType (typeof (NSObject))]
     interface TestClass {
         [Export ("SomeString")] string SomeString { get; set; }
         [Export ("getString")]  string GetString ();
         [Export ("getInt")]     int    GetInt ();
     }
 }

将其保存到AlexD.cs中,然后运行:

 /Developer/MonoTouch/usr/bin/mtouch AlexD.cs

这将生成包含您对本机库的绑定的AlexD.dll。你可以使用它加上适当的命令行参数来mtouch来访问你的库。

您还可以将本机库捆绑在DLL中,以简化分发(单个.dll将同时包含C#绑定和本机库),有关如何执行此操作的详细信息,请参阅:

http://docs.xamarin.com/ios/advanced_topics/binding_objective-c_types#Linking_the_Dependencies

答案 1 :(得分:2)

花了一些时间来弄清楚如何使它发挥作用。

  • 确保lib和app目标体系结构相同。 (我有libv7 for lib和armv6 for app)

  • 确保构建目标是相同的(适用于iOS的iOS设备和适用于iOS的iOS模拟器.iOS模拟器目标将体系结构设置为i386,这使得lib和app构建不兼容)

  • 由于某种原因,其他mtouch参数需要“-cxx -gcc_flags”,而不仅仅是“-gcc_flags”;

  • 出于某种原因。如果没有“-force_load”参数,lib就没有链接;

  • 将“-v -v -v”添加到其他mtouch参数以查看完整的构建日志。这有助于找到这个解决方案。

  • 必须禁用Thumb指令集(通过添加用户定义的项目选项GCC_THUMB_SUPPORT:NO来修复)

就是这样!