绑定的ObjectiveC类的C#问题
绑定的ObjectiveC类的C#问题绑定的ObjectiveC类的C#问题
MonoTouch的项目介绍了如何绑定的ObjectiveC类型与MonoTouch的使用。我们没能做到这一点对AdMob的库(也见monotouch-binding-for-admob blog at sabonrai dot wordpress dot com。
所以我们决定创建尽可能小的测试项目,我们写了一个简单objc类两种简单的方法,它返回一个字符串,一个返回一个整数
这里的TstLib.h:
#import <Cocoa/Cocoa.h>
@interface TstCls : NSObject {
}
- (NSString *) Version;
- (int) GimmeAnInt;
@end
和TstLib.m文件:
#import "TstCls.h"
@implementation TstCls
- (NSString *) Version {
return @"I ain't got a version, I'm a poor lonesome cowboy...";
}
- (int) GimmeAnInt {
return 110646;
}
@end
我们已经有了一点点objc控制台项目来验证这个库。代码如下:
#import <Cocoa/Cocoa.h>
#import "../TstLib/TstCls.h"
int main(int argc, char *argv[])
{
TstCls* tstCls = [[TstCls alloc] init];
NSLog(@"version = %@", [tstCls Version]);
NSLog(@"the int = %d", [tstCls GimmeAnInt]);
return NSApplicationMain(argc, (const char **) argv);
}
因此,让我们为btouch实用程序定义一个绑定文件。
using MonoTouch.Foundation;
namespace TstLib {
[BaseType (typeof (NSObject))]
interface TstCls {
[Export ("Version")]
string Version();
[Export ("GimmeAnInt")]
int GimmeAnInt();
}
}
然后创建一个libTstLib.a并与btouch实用程序TstLib.dll文件:
/Developer/MonoTouch/usr/bin/btouch -o TstLib.dll TstCls.cs
现在,我们创建一个新的MonoTouch的基于窗口的iPhone应用程序 'APITEST',添加一个lib目录与libTstLib.a和TstLib.dll文件,添加一个引用这个TstLib.dll和整合我们TstLib到Main.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using TstCls;
namespace ApiTest
{
// -gcc_flags "-L${ProjectDir}/Lib -lTstLib -ObjC"
// or
// -gcc_flags "-L${ProjectDir}/Lib -lTstLib -force_load ${ProjectDir}/Lib/libTstLib.a"
public class Application
{
static void Main (string[] args)
{
UIApplication.Main (args);
}
}
// The name AppDelegate is referenced in the MainWindow.xib file.
public partial class AppDelegate : UIApplicationDelegate
{
// This method is invoked when the application has loaded its UI and its ready to run
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
// If you have defined a view, add it here:
// window.AddSubview (navigationController.View);
TstLib.TstCls tstCls = new TstLib.TstCls();
Console.WriteLine ("TstLib.TstCls.Version() -> '{0}'", tstCls.Version());
Console.WriteLine ("TstLib.TstCls.GimmeAnInt() -> '{0}'", tstCls.GimmeAnInt());
window.MakeKeyAndVisible();
return true;
}
// This method is required in iPhoneOS 3.0
public override void OnActivated (UIApplication application)
{
}
}
}
这个小项目无两条Console.Writeline语句运行。只要执行一个Console.WriteLine语句,它就会崩溃而没有任何输出。
我们尽可能简洁,仍然提供足够的信息来重新创建测试用例。我们非常愿意提供任何其他信息来帮助解决这个问题。
有没有人看到为什么这不按预期工作?我们只限于测试我们是否可以为最小的ObjC类提供和使用绑定。
不幸的是,它失败了。它的失败方式与monotouch-binding-for-admob博客中介绍的MT_SampleAdMob项目相同。
我们的小项目使用标题为Binding_New_Objective-C_Types的monotouch dot net中描述的btouch方法,而MT_SampleAdMob项目使用在同一位置描述的“手动”方法。
这两种方法在类似的事情上都失败了。只要调用类或实例方法,应用程序就会崩溃而没有任何输出。
我们不知道可以做些什么来找出问题并找到解决办法。 Monotouch提供了许多ObjC类的c#绑定,所以它必须是可能的。我们仔细研究了上面引用的MonoTouch文档。我们无法看到MT_SampleAdMob或这种btouch方法在哪里偏离了规定的程序,但都失败了!
真的,我们迫切需要一些帮助在这里...
您可能没有禁用本地库的THUMB模式。自从iOS SDK 3.0以来,苹果链接器在将Thumb库链接到大型项目时遇到了问题。
您可以通过在Xcode中打开你的本地库,并执行以下操作禁用Thumb模式:
- 项目 - >编辑项目设置
- 类型“拇指”,在“搜索在构建设置”
- 取消选中框
- 重建您的本机库。
杰夫, 当然,你是对的。我忘了拇指的事情。我曾看到有关此方面的帖子,但从未看到有关此方面的明确简明解释。将这个应用到我的小测试库后,iPhone测试成功了。 因此,我现在将尝试为AdMob库解决此问题,并且我会在此处发布我的发现。 感谢您的帮助, Mollyke。 – guivho 2010-11-24 08:41:59