Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(三)

第一篇第二篇文章中,我們介紹了,怎麼集成友盟的Cocos2d-x版本SDK並且在Lua中使用。下面我們來看下怎樣在Quick-Cocos2d-x中使用Java版本的友盟SDK。

引擎版本: Quick-Cocos2d-x 3.3 開發系統: Windows 7 64bit

集成友盟Java版本的SDK

我們要集成SDK,首先要從官網下載,點擊打開官網,點擊“SDK下載”按鈕,將下載的SDK保存到本地。

打開工程的AndroidMainfest.xml文件,在標籤內寫入

1
2
<meta-data android:value="5546df1a67e58eaf730008b7" android:name="UMENG_APPKEY"></meta-data>
<meta-data android:value="TestChannel" android:name="UMENG_CHANNEL"/>

上面兩個參數是友盟的AppKey和渠道號,AppKey是我們在後臺申請App時生成的,渠道號自己定義。

接着在外寫入

1
2
3
4
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

解壓下載回來的包,將裏面的libs文件夾合併到android工程下的libs文件夾中。

接下來,打開AppActivity.java文件,在onCreate中加入:

1
2
UMGameAgent.setDebugMode(true);//設置輸出運行時日誌
UMGameAgent.init( this );

在onResume()中加入:

1
UMGameAgent.onResume(this);

在onPause()中加入:

1
UMGameAgent.onPause(this);

LuaJavaBridge

爲了我們在Lua中調用Java的接口,Quick-Cocos2d-x裏面提供了一套名爲LuaJavaBridge的中間件。它能夠讓我們非常方便的在Lua中調用靜態的Java接口。

LuaJavaBridge在Lua中使用的接口爲

1
luaj.callStaticMethod(className, methodName, args, sig)

這個函數有4個參數,它們的意義分別爲:

參數 意義
className 類名
methodName 方法名
args 參數表
sig 簽名
  • 類名參數是我們使用的靜態方法所在的類名;
  • 方法名是我們要是用的方法的名稱;
  • 參數表示我們要傳入的參數,這個值是一個lua的table,它傳入的內容必須和sig中的類型一致;
  • 簽名是我們要調用的函數的Java參數信息表。

所謂簽名,就是指 Java 方法的參數類型和返回類型定義。關於 Java 方法簽名的具體定義,可以參考:JNI Type Signatures

由於簽名寫起來有點囉嗦,所以 luaj 可以根據調用參數自動猜測方法簽名。 注意 Lua function 是以整數的形式傳入 Java 方法,所以 Java 方法的如果需要傳入Lua function的話形參是 int 類型)。

但是 Lua 裏沒有辦法準確判斷一個數值是整數還是浮點數,所以 luaj 在猜測方法簽名時,假定所有的數值都是浮點數。如果遇到這種情況的話就需要指定簽名了。

通過LuaJavaBridge調用友盟

上面的描述有點不好理解,我們拿友盟作爲例子來看下。

用EClipse打開我們剛纔使用的android工程。

爲了方便調用友盟的接口,我們新建一個類,取名爲UMSDK。複製如下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package org.cocos2dx.lua;
 
import org.cocos2dx.lib.Cocos2dxActivity;
 
import com.umeng.analytics.game.UMGameAgent;
 
public class UMSDK {
    private static Cocos2dxActivity mContext = null;
 
    public static void init(Cocos2dxActivity activity){
        mContext = activity;
    }
 
    public static void startLevel(final String level){
 
        mContext.runOnGLThread(new Runnable() {
 
            @Override
            public void run() {
                // TODO Auto-generated method stub
                UMGameAgent.startLevel(level);
            }
        });
    }
 
    //關卡失敗
    public static void failLevel(final String level){
 
        mContext.runOnGLThread(new Runnable() {
 
            @Override
            public void run() {
                // TODO Auto-generated method stub
                UMGameAgent.failLevel(level);
            }
        });
    }   
 
    //過關
    public static void finishLevel(final String level){
 
        mContext.runOnGLThread(new Runnable() {
 
            @Override
            public void run() {
                // TODO Auto-generated method stub
                UMGameAgent.finishLevel(level);
            }
        });
    }   
 
    //關卡失敗
    public static void pay(final float money, final float coin, final int source){
 
        mContext.runOnGLThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                UMGameAgent.pay(money, coin, source);
            }
        });
    }       
 
    public static void pay(final float money,final String item ,
            final int number, final float coin,final int source){
 
        mContext.runOnGLThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                UMGameAgent.pay(money, item, number, coin, source);
            }
        });
    }
 
    public static void buy(final String item, final int number,final float price){
        mContext.runOnGLThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                UMGameAgent.buy(item, number, price);
            }
        });
    }
 
    public static void use(final String item, final int number,final float price){
        mContext.runOnGLThread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                UMGameAgent.buy(item, number, price);
            }
        });
    }
}

我們在Java文件中封裝了友盟幾個常用的接口。這些接口基本上都是遊戲中要用到的,寫好上面的類之後,在AppActivity的onCreate中加入

1
UMSDK.init(this);

接下來,我們轉回到Lua層來調用我們剛剛封裝好的Java層的接口。先把原來友盟的接口全都去掉。

新建一個Analytics.lua文件,寫入以下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
--
-- Author: wangshuai
-- Date: 2015-05-05 14:56:41
--
local Analytics = class("Analytics")
 
function Analytics.startLevel(level)
    local args = {
        toslevel or "1",
    }
 
    if device.platform == "android" then
 
        -- Java 類的名稱
        local className = "com/cocos2dx/demos/umeng/UMSDK"
        -- 調用 Java 方法
        luaj.callStaticMethod(className, "startLevel", args)
    end
end
 
function Analytics.failLevel(level)
    local args = {
        level or "1",
    }
 
    if device.platform == "android" then
 
        -- Java 類的名稱
        local className = "com/cocos2dx/demos/umeng/UMSDK"
        -- 調用 Java 方法
        luaj.callStaticMethod(className, "failLevel", args)
    end
end
 
function Analytics.finishLevel(level)
    local args = {
        level or "1",
    }
 
    if device.platform == "android" then
 
        -- Java 類的名稱
        local className = "com/cocos2dx/demos/umeng/UMSDK"
        -- 調用 Java 方法
        luaj.callStaticMethod(className, "finishLevel", args)
    end
end
 
function Analytics.payCoin(params)
    local args = {
        params.money or 0.0,
        params.coin or 0.0,
        params.source or 1,
    }
 
    if device.platform == "android" then
 
        -- Java 類的名稱
        local className = "com/cocos2dx/demos/umeng/UMSDK"
        -- 調用 Java 方法
        luaj.callStaticMethod(className, "pay", args, "(FFI)V")
    end
end
 
function Analytics.payItem(params)
    local args = {
        params.money or 0.0,
        params.item or "null",
        params.number or 1,
        params.coin or 0.0,
        params.source or 1,
    }
 
    if device.platform == "android" then
 
        -- Java 類的名稱
        local className = "com/cocos2dx/demos/umeng/UMSDK"
        -- 調用 Java 方法
        luaj.callStaticMethod(className, "pay", args, "(FLjava/lang/String;IFI)V")
    end
end
 
function Analytics.buy(params)
    local args = {
        params.item or "null",
        params.number or 1,
        params.coin or 1,
    }
 
    if device.platform == "android" then
 
        -- Java 類的名稱
        local className = "com/cocos2dx/demos/umeng/UMSDK"
        -- 調用 Java 方法
        luaj.callStaticMethod(className, "buy", args, "(Ljava/lang/String;IF)V")
    end
end
 
function Analytics.use(params)
    local args = {
        params.item or "null",
        params.number or 1,
        params.coin or 1,
    }
 
    if device.platform == "android" then
 
        -- Java 類的名稱
        local className = "com/cocos2dx/demos/umeng/UMSDK"
        -- 調用 Java 方法
        luaj.callStaticMethod(className, "use", args, "(Ljava/lang/String;IF)V")
    end
end
 
return Analytics

上面的就是我們在Lua中調用Java中編寫的函數,args是傳給Java接口的參數,className是要調用的類的名稱。組織好之後就可以調用luaj.callStaticMethod調用Java接口了。

關於LuaJavaBridge的詳細介紹可以參考廖大的這篇文章

好了,關於第三方SDK的集成就暫時介紹到這裏,有什麼問題或者不足的地方歡迎大家指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章