跳票工厂-RoboVM项目接入IOS原生库文件
05
2015
01

RoboVM项目接入IOS原生库文件

    很多时候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)

                    {

                    }

                }


« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。