很多时候IOS项目需要接入第三方的库文件,比如facebook SDK、admob之类,对于xcode工程一般是接入其原生的.a库文件,调用相关方法即可。基于Java的RoboVM工程也可以调用原生的.a库文件,我们需要做的就是个.a文件编写Java绑定代码。
前期准备
刚才提到的facebook、admob,以及很多主流的广告、支付、统计等SDK在git上已经有人实现了RoboVM的绑定代码,可供直接使用或做为参考。同时该项目的页面也简单介绍了如何自己去实现IOS的代码绑定,讲解了实现方法、属性、代理、枚举等。项目地址:https://github.com/BlueRiverInteractive/robovm-ios-bindings
国外主流SDK基本都有绑定了,但国内情况没那么好,由于国内cocos2d-x的流行,Libgdx和RoboVM才刚刚兴起很少受到关注,所以国内大部分SDK都需要自己去实现绑定。在自己做绑定之前要做以下准备:
1)首先你要有RoboVM的使用经验,熟悉OSX下通过RoboVM开发IOS项目的一般流程(包括开发者中心各种操作和相关代码编写),如果这些你还不了解,请看我之前的文章。
2)对objective c进行一定地了解,不必多深入,但最起码知道obj c里的类、方法、属性、协议、代理是什么,能大致读懂SDK提供的.h文件。建议没了解过的朋友先在网上了解一下objc c。
robovm工程配置
上面没问题的话,首先就可以做robovm的工程配置了。如图,以移动游戏基地的IOS SDK为例,它提供了三个文件,Res.bundle是SDK的资源文件,GameBilling.h是接口,libGameBillingSDK.a就是库文件了,我们要做的就是实现他的.h文件里的接口去调用.a文件完成绑定,再来实现该SDK的接入。
首先将Res.bundle放入RoboVM工程的data目录,libGameBillingSDK.a放入工程的libs/ios目录,并在robovm.xml里添加该库的引用。阅读移动的SDK文档得知要加入一些列的framework引用,同样也在robovm.xml加入,如下图:
SDK可能还会要求一些额外的权限,我们可以在Info.plist里加入,如图:
绑定代码编写
这一部分完全可以参考robovm-ios-bindings提供的教程以及国外一些SDK的绑定代码。因为教程已经很详细了,下面我只做简单概述,并着重介绍一些自己实现RoboVM绑定时,遇到的需要注意的事项。
1)类绑定:
objc:@interface GameBilling : NSObject{}
java:public class GameBilling extends NSObject{}
2)方法绑定,要注意静态以及多参数的情况:
objc:+ (GameBilling *)initializeGameBilling;
java:
@Method(selector = "initializeGameBilling")
public static native GameBilling initializeGameBilling();
objc:- (void)onBillingResult:(BillingResultType)resultCode billingIndex:(NSString *)index message:(NSString *)message;
java:
@Method(selector = "onBillingResult:billingIndex:message:")
void onBillingResult(BillingResultType resultCode, NSString index, NSString message);
3)属性绑定:
objc:@property (nonatomic,assign) id <GameBillingDelegate> delegate;
java:
@Property
public native GameBillingDelegate getDelegate();
@Property(strongRef = true)
public native void setDelegate(GameBillingDelegate delegate);
4)枚举绑定,注意常量的值一定要对应:
objc:
typedef enum{
BillingResultType_PaySuccess = 0x1000,
BillingResultType_PaySuccess_Activated,
BillingResultType_PayFail ,
BillingResultType_Cancel ,
BillingResultType_GetVericode_Success,
BillingResultType_GetVericode_Fail,
BillingResultType_No_NetWork,
BillingResultType_Other,
} BillingResultType;
java:
public enum BillingResultType implements ValuedEnum
{
PaySuccess(0x1000), PaySuccessActivated(0x1001), PayFail(0x1002), Cancel(0x1003),
GetVericodeSuccess(0x1004), GetVericodeFail(0x1005), NoNetwork(0x1006),
Other(0x1007), NotDownload(0x1008);
private final long n;
private BillingResultType(long n)
{
this.n = n;
}
@Override
public long value()
{
return n;
}
}
5)绑定协议和委托:
objc:
@protocol GameBillingDelegate;
@protocol GameBillingDelegate<NSObject>
@required
- (void)onBillingResult:(BillingResultType)resultCode billingIndex:
(NSString *)index message:(NSString *)message;
@end
java:
public interface GameBillingDelegate extends NSObjectProtocol
{
@Method(selector = "onBillingResult:billingIndex:message:")
void onBillingResult(BillingResultType resultCode, NSString index,
NSString message);
}
//使用时用该类实现接口,并重写接口的方法
public class GameBillingDelegateAdapter extends NSObject
implements GameBillingDelegate
{
@Override
public void onBillingResult(BillingResultType resultCode, NSString index,
NSString message)
{
}
}
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。