手動整合 SDKBOX on Cocos2d-x 3.x — Android

Terry Huang
安郡尼爾筆記
Published in
7 min readOct 3, 2018

前情提要可參考:手動整合 SDKBOX on Cocos2d-x 3.x — iOS

沒成功過的原廠 Patch

由於 Cocos2d-x 建立專案的方式相當多元,而且各版本的變異性很大,造就了自動化得整合非常困難,小弟我幾乎沒有印象有使用成功過。除此之外,由於 Open Source 與架構上的設計,非常方便讓使用者針對基底程式進行修改,也相當性的增加了難度。所以,還是筆記一下手動整合的細部步驟吧!

手動整合 SDKBOX on Android Project

a. 下載 Bundle File for cocos2d-x v3.x

請到這個網頁來下載,在 #3 install manually 中,選擇下載 Bundle file(或是直接點我下載

b. 將所需的 Library 引入

  1. 將下載的 Bundle file/plugin/android/libs 中的 PluginIAP.jar 以及 sdkbox.jar 複製到專案使用的 cocos2d library 中(billing 等等透過 gradle 引入最新版本)
# 使用 cocos2d-x source 版本
cocos2d/cocos/platform/android/java/libs
cocos2d/cocos/platform/android/libcocos2dx/libs
# 使用 cocos2d-x prebuilt 版本
<project_root>/libs

2. 在 App 的 build.gradle 引入 billing library

implementation 'com.android.billingclient:billing:1.1'

c. 修改 AndroidManifest.xml

  1. 新增 uses-permission
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.android.vending.BILLING"/>

2. 在 Application 中新增 Activity

<activity
android:name="com.android.billingclient.api.ProxyBillingActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>

d. 複製 JNI

  1. 將下載的 Bundle file/plugin/android/jni 中的 PluginIAP 以及 sdkbox 兩個資料夾,複製到專案使用的 cocos2d library 中
proj.android-studio/app/jni

e. 修改專案中 Android.mk

  1. 新增 LOCAL_WHOLE_STATIC_LIBRARIES
# 如果原本‘已有’ LOCAL_WHOLE_STATIC_LIBRARIES,那就再繼續加上
LOCAL_WHOLE_STATIC_LIBRARIES += PluginIAP LOCAL_WHOLE_STATIC_LIBRARIES += sdkbox
# 如果原本‘無’ LOCAL_WHOLE_STATIC_LIBRARIES,那就直接加入
LOCAL_WHOLE_STATIC_LIBRARIES := PluginIAP sdkbox

2.加入以下 import 設定

# 須在所有 import-module 之前
$(call import-add-path,$(LOCAL_PATH))
# 新增 import-module
$(call import-module, ./sdkbox)
$(call import-module, ./pluginiap)

f. 修改專案中 Application.mk (僅 Cocos2d-x v3.0 — v3.2 需要)

APP_STL := c++_static 改為 APP_STL := gnustl_static

g. 修改 Cocos2dxActivity.java

# 檔案位於以下路徑
cocos2d/cocos/platform/android/java/src/org/cocos2dx/lib/
  1. 新增 import
import com.sdkbox.plugin.SDKBox;

2. 在 onCreate 中,新增 SDKBox 初始化程序

# 在 onLoadNativeLibraries 之後新增 SDKBox.init
onLoadNativeLibraries();
SDKBox.init(this);

3. 在 Activity Lifecycle 事件、Back按鈕事件、Activity 返回事件中新增程序

# onStart, onStop, onResume, onPause
# onBackPressed, onActivityResult
@Override
protected void onStart() {
super.onStart();
SDKBox.onStart();
}
@Override
protected void onStop() {
super.onStop();
SDKBox.onStop();
}
@Override
protected void onResume() {
super.onResume();
SDKBox.onResume();
}
@Override
protected void onPause() {
super.onPause();
SDKBox.onPause();
}
@Override
public void onBackPressed() {
if(!SDKBox.onBackPressed()) {
super.onBackPressed();
}

}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(!SDKBox.onActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}

}

h. 更改 AppActivity 繼承

編輯負責專案啟動的 AppActivity.java(應該在 org.cocos2dx.cpp 的 namespace 底下),更改其繼承自 SDKBoxActivity

public class AppActivity extends com.sdkbox.plugin.SDKBoxActivity {

錯誤排除

a. 使用與 bundle 同版本的 support library

b. 啟用 multiDex,點我看說明

新增設定檔案

  • 新增 sdkbox_config.json 檔案,放置在專案資源資料夾 Resources 底下
  • 可依照平台、Plugin、加入設定資料,比如範例中,將 android 的 iap 中,加入了一個 item,這個 item 需要與 Google Play Console 中的物品 ID 設定相符合,key 也需要與 Google Play Console 中授權公開金鑰相同
範例中 unlockstories 即為 Item Id,可依照需求列入多項商品

其他

--

--

Terry Huang
安郡尼爾筆記

Co-Founder of LiRise Co.,Ltd. In charge of innovative affairs development. Tags: Guitar, Golf, Photograph, Cocktail, Dance, Diving, Travel.