## 一、概述
1． 此文档为Cocos2dx原生游戏接入
2． 文档对应SDK版本为3.0.4
3． 详细接入步骤请参考Demo

## 二、接入准备

### 2.1、工程导入
将SDK项目中Android目录下assets目录下文件复制到游戏目录assets目录下，将Android目录下libs下jar文件复制到游戏目录libs目录下，将Android目录下res中资源文件复制到游戏目录res中

### 2.2、配置信息
找到游戏的主Activity，即继承于Cocos2dxActivity的游戏主Activity，修改该Activity的继承为FuncellCocos2dxActivity,如下图：
![](images/doc_img/Cocos2dx-lua-01.png)

### 2.3、配置AndroidManifest.xml文件
```xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<activity
    android:name="com.funcell.platform.android.game.proxy.FuncellSDKLoginActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="behind"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
 <activity
    android:name="com.funcell.platform.android.game.proxy.pay.funcell.FunSdkUiActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="behind"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<meta-data ndroid:name="FUNCELL_CHANNEL_TEST" android:value="@string/FUNCELL_CHANNEL_TEST" />
```

## 三、接入接口

### 3.1、初始化接口（必接）
在使用到FuncellGameSdkProxy的地方首先导入头文件`"FuncellGameSdkProxy.h"`
```java
class InitCallBackImpl : public IFuncellInitCallBack{
public:
	virtual void onInitSuccess(){//初始化成功}
	virtual void onInitFailure(const char *msg){// 初始化失败}
};

class SessionCallBackImpl : public IFuncellSessionCallBack{
public:
	virtual void onLoginSuccess(FuncellSession *session){mSession = session;} //登录成功
	virtual void onLoginCancel(){}//取消登录
	virtual void onLoginFailed(char *paramString){}//登录失败
	virtual void onLogout(){}//退出登录
FuncellSession为登录成功后返回：
const char *mChannelCode; //渠道标识
const char *mUserID; //平台用户ID
const char *mUsername; //平台用户名
const char *mToken; //平台token
const char *mProductCode; //游戏标识
const char *mChannelUserId; //渠道用户ID
const char *mChannelUserName; //渠道用户名

};

class PayCallBackImpl : public IFuncellPayCallBack{
	virtual void onSuccess(char *cpOrder, char *sdkOrder,char *extrasParams){}//支付成功
	virtual void onFail(char *paramString){}//支付失败
	virtual void onCancel(char *paramString){}//取消支付
cpOrder：游戏订单号
sdkOrder：平台订单号
extrasParams：游戏透传参数
};
FuncellGameSdkProxy::Init(new InitCallBackImpl(),new SessionCallBackImpl(),new PayCallBackImpl());

```

### 3.2、登录接口（必接）
```java
FuncellGameSdkProxy::Login();
```

### 3.3、登出接口（必接）
```java
FuncellGameSdkProxy::Logout();
```

### 3.4、支付接口（必接）

**游戏没有的字段可以设置为 &quot;&quot; 空字符串**
```java
string RoleName = "test1"; //角色名
string RoleId = "123";//角色ID
string RoleLevel = “2”;//角色等级
string ServerName = "test";//服务器名
string ServerId = "998";//服务器ID
string VipLevel = "3";//VIP等级
string GameGoldBalance = "888";//剩余元宝、钻石数量
string GameUnionName = "游戏工会";//游戏工会
RoleInfo *roleInfo = new RoleInfo();
roleInfo->setRoleName((char*) RoleName.c_str());
roleInfo->setRoleId((char*) RoleId.c_str());
roleInfo->setRoleLevel((char*) RoleLevel.c_str());
roleInfo->setServerName((char*) ServerName.c_str());
roleInfo->setServerId((char*) ServerId.c_str());
roleInfo->setVipLevel((char*) VipLevel.c_str());
roleInfo->setGameGoldBalance((char*) GameGoldBalance.c_str());
roleInfo->setGameUnionName((char*) GameUnionName.c_str());
FuncellPayParams *PayParams = new FuncellPayParams();
PayParams->setItemName("10元宝");//商品名
PayParams->setItemId("100002");//商品ID
PayParams->setItemCount(10);//商品钻石、元宝数量
PayParams->setItemDescription("商品描述");//商品描述
PayParams->setItemAmount(10);//价格、单位/分
PayParams->setExtrasParams("test");//透传参数
PayParams->setItemType("元宝");//商品类型
PayParams->setOrderId("游戏订单号");//游戏订单号
PayParams->setRoleInfo(roleInfo);
FuncellGameSdkProxy::Pay(PayParams);
```

### 3.5、数据统计接口（必接）

**创建角色事件 ： 创建角色后调用**

```java
const char *userId = mSession->getUserId(); //登录成功后的 用户ID
string serverno = "998"; //服务器ID
string role_id = "123";//角色ID
string role_name = "test";//角色名
string server_name = "天下";//服务器名
char json[256] = { 0 };
	sprintf(json,"{\"usermark\":\"%s\",\"serverno\":\"%s\",\"role_id\":\"%s\",\"role_name\":\"%s\",\"server_name\":\"%s\"}",userId, serverno.c_str(), role_id.c_str(),role_name.c_str(),server_name.c_str()); //拼装json数据
FuncellGameSdkProxy::SetDatas(DATA_CREATE_ROLE,json);
```

**登录事件：登录游戏并选择了服务器后调用**
```java
string serverno = "998";//服务器ID
const char *userId = mSession->getUserId();//登录成功后的 用户ID
char  json[128] = {0};
sprintf(json,"{\"usermark\":\"%s\",\"serverno\":\"%s\"}",userId,serverno.c_str());//拼装json数据
FuncellGameSdkProxy::SetDatas(DATA_LOGIN,json);
```

**角色升级事件：角色升级后调用**
```java
const char *userId = mSession->getUserId();//登录成功后的 用户ID
string serverno = "998";//服务器ID
string level = "999";//角色等级
string role_id = "123";//角色ID
string role_name = "test";//角色名
string server_name = "天下";//服务器名
char  json[256] = {0};
sprintf(json,"{\"usermark\":\"%s\",\"serverno\":\"%s\",\"level\":\"%s\",\"role_id\":\"%s\",\"role_name\":\"%s\",\"server_name\":\"%s\"}",userId, serverno.c_str(), level.c_str(), role_id.c_str(),role_name.c_str(),server_name.c_str()); //拼装json数据
FuncellGameSdkProxy::SetDatas(DATA_ROLE_LEVELUP,json);
```

**角色服务器事件：可在进入游戏主场景时调用**
```java
const char *userId = mSession->getUserId();//登录成功后的 用户ID
string serverno = "998";//服务器ID
string role_level = "999";//角色等级
string role_id = "123";//角色ID
string role_name = "test";//角色名
string server_name = "天下";//服务器名
string role_vip_level = "VIP等级";
string role_gameunion_name = "工会";
char json[256] = { 0 };
sprintf(json,"{\"usermark\":\"%s\",\"serverno\":\"%s\",\"role_id\":\"%s\",\"role_name\":\"%s\",\"server_name\":\"%s\",\"role_level\":\"%s\",\"role_vip_level\":\"%s\",\"role_gameunion_name\":\"%s\"}",userId, serverno.c_str(), role_id.c_str(), role_name.c_str(),server_name.c_str(), role_level.c_str(), role_vip_level.c_str(),role_gameunion_name.c_str()); //拼装json数据
FuncellGameSdkProxy::SetDatas(DATA_SERVER_ROLE_INFO,json);
```

### 3.6、游戏退出接口（必接）

```java
class ExitCallBackImpl : public IFuncellExitCallBack{
public:
	virtual void onChannelExit(){} //渠道有退出界面
	virtual void onGameExit(){}//渠道无退出界面
};
FuncellGameSdkProxy::Exit(new ExitCallBackImpl());
```

### 3.7获取渠道是否有退出界面（可选）
```java
FuncellGameSdkProxy::GetExitUI();
```
返回值：0 ：渠道无退出界面，其他值：渠道有退出界面

## 四、	注意事项
##### 1. 接入者在JNI目录下Android.mk中添加LOCAL_SHARED_LIBRARIES := funcell123plugin
include $(LOCAL_PATH)/prebuilt/Android.mk
如下图所示：主要用于编译是链接libcell123plugin.so文件
![](images/doc_img/Cocos2dx-lua-03.png)
##### 2. 将demo中jni目录下prebuilt目录拷贝到自己的jni目录下

## 五、	常见错误及解决方案
##### 1. 成功后，运行游戏或者Demo出现以下类似错误，请检查NDK版本是否为NDK R10，如果是NDK R10,请跟换NDK R9编译
##### 2. 运行游戏崩溃，请根据自己的cocos2dx版本来修改引用库文件方式
###### Cocos2dx 2.x版本
方式：采用静态代码块loadLibrary方式
![](images/doc_img/Cocos2dx-lua-04.png)
###### Cocos2dx 3.x版本
方式：废弃了2.0的方式，需要在AndroidManifest里申明meta-data方式引用，如下图：
![](images/doc_img/Cocos2dx-lua-05.png)