【问题标题】:XCode static lib and monotouch bindingsXCode 静态库和单点触控绑定
【发布时间】:2011-12-28 09:29:26
【问题描述】:

我在 xcode 中有一个简单的静态库,只有一个类 测试.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 等是空值,但应用程序运行并以 getInt、getString 和 SomeString 形式返回空值。如果我将定义更改为

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    详细的文档在这里:

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

    您的变量为空的原因是您没有正确初始化库(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

    【讨论】:

    • 谢谢,我不知道可以将 .a 嵌入到最终的 dll 中。这真的很有用!
    【解决方案2】:

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

    • 确保 lib 和应用程序目标架构相同。 (我有用于 lib 的 armv7 和用于 app 的 armv6)

    • 确保构建目标相同(lib 的 iOS 设备和应用的 iOS 模拟器。iOS 模拟器目标将架构设置为 i386,这使得 lib 和应用构建不兼容)

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

    • 由于某种原因,没有“-force_load”参数的库没有链接;

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

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

    就是这样!

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      相关资源
      最近更新 更多