我在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文件。是否有更简单的方法从库和头文件生成绑定?
答案 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来修复)
就是这样!