TouchJSON的Monotouch绑定?

时间:2010-11-24 20:17:46

标签: iphone objective-c xamarin.ios admob touchjson

适用于iPhone的admob sdk使用专有的libAdMobNoThumb.a库和基于Objective-C源的TouchJSON库。

有人知道TouchJSON的C#绑定,以便我们可以包含它吗?

或者有人知道如何构建可以包含的库吗?

我们使用Xcode创建了一个iPhone库项目,并添加了完整的TouchJSON源代码树。我们在测试iPhone应用中将结果libTouchJSON.a与以下gcc_flags链接:

-v -v -v -gcc_flags "-L${ProjectDir}/Lib -lAdMobNoThumb -lTouchJSON -force_load ${ProjectDir}/Lib/libAdMobNoThumb.a -force_load ${ProjectDir}/Lib/libTouchJSON.a"

这产生了以下错误输出(感谢-v -v -v):

Error 1: mtouch failed with the following message:
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m: In function 'monotouch_debug_connect':
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:1779: warning: implicit declaration of function 'select'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m: In function 'main':
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:1821: warning: implicit declaration of function 'chdir'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:1838: warning: implicit declaration of function 'monotouch_enable_debug_tracking'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:1914: warning: implicit declaration of function 'dup2'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:1921: warning: implicit declaration of function 'mini_get_debug_options'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:1925: warning: implicit declaration of function 'mono_debugger_agent_parse_options'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:2052: warning: implicit declaration of function 'getpagesize'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:2055: warning: cast from pointer to integer of different size
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmpe374af5.tmp/main.m:2055: warning: initialization makes pointer from integer without a cast
Undefined symbols:
  "_OBJC_CLASS_$_CJSONSerializer", referenced from:
      objc-class-ref-to-CJSONSerializer in libAdMobNoThumb.a(AdMobAd.o)
      objc-class-ref-to-CJSONSerializer in libAdMobNoThumb.a(AdMobWebView.o)
      objc-class-ref-to-CJSONSerializer in libAdMobNoThumb.a(AdMobFlexWebView.o)
  "_OBJC_CLASS_$_CJSONDeserializer", referenced from:
      objc-class-ref-to-CJSONDeserializer in libAdMobNoThumb.a(AdMobOpener.o)
      objc-class-ref-to-CJSONDeserializer in libAdMobNoThumb.a(AdMobSearchViewController.o)
      objc-class-ref-to-CJSONDeserializer in libAdMobNoThumb.a(AdMobAd.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
 (1) (AdMobber)

有什么建议可以解决这个问题?

TIA,Mollyke。

3 个答案:

答案 0 :(得分:4)

您的AdMob库无法找到CJSONDeserializer或CJSONSerializer类,我认为这些类来自libTouchJSON.a。通常这意味着您的libTouchJSON.a未包含在您的项目中。您应该仔细检查所有额外的参数,并确保您的libTouchJSON不是拇指,并包括您尝试链接的所有体系结构(x86代表模拟器,armv6代表设备)

答案 1 :(得分:0)

埃里克,

很抱歉延迟,但最近我一直忙于纯xcode项目。让我告诉你我是如何创建一个TouchJSON库的。

我用xcode创建了一个库项目,并复制了最新的admob库附带的TouchJSON源代码。我构建了两个nothumb发行版本,一个用于模拟器,一个用于设备。这产生了两个库。为了便于在MT项目中使用这些,我使用lipo工具将它们组合成一个胖库。胖库很方便,因为它们可以在模拟器和设备构建中使用。完整的项目,包括胖库libTouchJSON.a和用于构建胖女士的脚本,存在于http://www.filedropper.com/touchjson的zip文件中。

(注意:这是作为我最初问题的答案而发布的,因为它被Eric S作为对该问题的评论而被接受的时间有点太长了)

答案 2 :(得分:0)

由于很多人会发现这个问题,你可以在github上发布的adob上使用最新的monotouch绑定https://github.com/dalexsoto/AlexTouch.GoogleAdMobAds

以下是如何使用它以及如何使用其事件

的示例
public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            var ad = new GADBannerView(new RectangleF(new PointF(0,0), GADBannerView.GAD_SIZE_300x250))
            {
                AdUnitID = "Use Your AdMob Id here",
                RootViewController = this

            };

            ad.DidReceiveAd += delegate 
            {
                this.View.AddSubview(ad);
                Console.WriteLine("AD Received");
            };

            ad.DidFailToReceiveAdWithError += delegate(object sender, GADBannerViewDidFailWithErrorEventArgs e) {
                Console.WriteLine(e.Error);
            };

            ad.WillPresentScreen += delegate {
                Console.WriteLine("showing new screen");
            };

            ad.WillLeaveApplication += delegate {
                Console.WriteLine("I will leave application");
            };

            ad.WillDismissScreen += delegate {
                Console.WriteLine("Dismissing opened screen");
            };

            Console.Write("Requesting Ad");
            ad.LoadRequest(new GADRequest());
}