在第一篇和第二篇文章中,我們介紹了,怎麼集成友盟的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的集成就暫時介紹到這裏,有什麼問題或者不足的地方歡迎大家指出。