将ObjectiveC类绑定到C#问题
monotouch项目描述了如何绑定Objective-C类型以与MonoTouch一起使用.我们没有为AdMob库执行此操作(另请参阅sabonrai dot wordpress dot com上的monotouch-binding-for-admob博客.
所以我们决定创建尽可能小的测试项目.我们用两个简单的方法编写了一个简单的objc类,一个返回一个字符串,另一个返回一个整数.
这是TstLib.h:
#import <Cocoa/Cocoa.h>
@interface TstCls : NSObject {
}
- (NSString *) Version;
- (int) GimmeAnInt;
@end
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
我们有一个小的objc控制台项目来验证这个库.这是代码:
#import <Cocoa/Cocoa.h>
#import "../TstLib/TstCls.h"
int main(int argc, char *argv[])
{
TstCls* tstCls = [[TstCls alloc] init];
NSLog(@"version = %@", [tstCls Version]); …Run Code Online (Sandbox Code Playgroud) 在iOS SDK 4.2的MonoTouch项目中使用AdMob
我们有一个测试项目尝试将AdMob与MonoTouch一起使用.设置如下:
我们创建了一个(胖)TouchJSON库,如TouchJSON的Monotouch绑定中所述?
我们有一个Libs库,其中包含此libTouchJSON.a和AdMob提供的libAdMobNoThumb.a库.在那里,我还有一个来自AdMob.cs文件的btouch的AdMob.dll,它定义了我们想要使用的(有限的一组)Admob方法.此dll将添加到项目的引用中
我们提供以下额外标志:
-v -v -v -gcc_flags "-L${ProjectDir}/../Libs -lAdMobNoThumb -lTouchJSON -force_load ${ProjectDir}/../Libs/libAdMobNoThumb.a -force_load ${ProjectDir}/../Libs/libTouchJSON.a"
Run Code Online (Sandbox Code Playgroud)
我们选择"不链接"作为链接器行为.
这曾经使用了admob库的SDK 4.2之前的版本.但现在有了4.2版本,我们得到了
ld: framework not found AudioUnit
Run Code Online (Sandbox Code Playgroud)
错误.我们已经读过,解决方案是"重新启动链接器".但是如果我们进行链接(如上所述保留其余的设置),我们会从admob库中获得许多未知符号:
Error 1: mtouch failed with the following message:
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m: In function 'monotouch_debug_connect':
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m:1779: warning: implicit declaration of function 'select'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m: In function 'main':
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m:1821: warning: implicit declaration of function 'chdir'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m:1838: warning: implicit declaration of function 'monotouch_enable_debug_tracking'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m:1914: warning: implicit declaration of function 'dup2'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m:1921: warning: implicit declaration of function 'mini_get_debug_options'
/var/folders/hF/hF42FIdhEUmY1y-pGRsu1k+++TI/-Tmp-/tmp2685841f.tmp/main.m:1925: …Run Code Online (Sandbox Code Playgroud) 使用这个最小的网页:
<html>
<head>
<title>test</title>
<script type='text/javascript' src='test.js'></script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这个最小的“test.js”脚本失败了:
document.body.innerText = 'testje';
Run Code Online (Sandbox Code Playgroud)
document.body 似乎未定义:
0x800a138f - JavaScript runtime error: Unable to set property 'innerText'
of undefined or null reference
Run Code Online (Sandbox Code Playgroud)
如果在代码行之前添加 document.write('blabla') ,它会起作用:
document.write('blabla');
document.body.innerText = 'testje';
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,尽管它看起来很基本。
我是一个 Javascript 新手,所以一些解释将是最受欢迎的。
admob ×2
iphone ×2
xamarin.ios ×2
c# ×1
javascript ×1
monodevelop ×1
objective-c ×1
touchjson ×1