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

## 二、接入准备

### 2.1、工程导入
将SDK项目中Android目录下assets目录下文件复制到游戏目录assets目录下，将Android目录下res中资源文件复制到游戏目录res中(Demo使用的Intellij Idea开发环境，如果使用FB开发的同学，需要引入相应资源文件和FuncellSDKAir.ane到自己的工程中)

### 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" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<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" />
```

### 2.4、文件导入及配置
##### 2.4.1：导入Cpp源码目录下的FuncellGameSdkProxy.h至cocos2dx项目下的Classes目录下，如下图所示：
![](images/doc_img/Cocos2dx-lua-02.png)
##### 2.4.2：在AppDelegate类中引入头文件`#include "FuncellGameSdkProxy.h"`,具体实现可参考Demo

## 三、接入接口(具体请参考AppDelegate.cpp与hello.lua文件)

### 3.0、逻辑实现
##### 3.0.1：在AppDelegate类中当Lua引擎初始化完成后，调用initFuncellLuaEnvironment()方法注册Lua接口函数
```lua
CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
    CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);

    CCLuaStack *pStack = pEngine->getLuaStack();
    lua_State *tolua_s = pStack->getLuaState();
    tolua_extensions_ccb_open(tolua_s);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
    pStack = pEngine->getLuaStack();
    tolua_s = pStack->getLuaState();
    tolua_web_socket_open(tolua_s);
#endif

#if (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY)
    CCFileUtils::sharedFileUtils()->addSearchPath("script");
#endif

    initFuncellLuaEnvironment(tolua_s);
```
##### 3.0.2：具体Lua示例参考Demo中assets目录下hello.lua,并在对应接口中处理回调信息

### 3.1、初始化接口（必接）
在使用到FuncellGameSdkProxy的地方首先导入头文件`"FuncellGameSdkProxy.h"`
```lua
-- 初始化
function FuncellLuaInit()
	print("------FuncellLuaInit")
	doFuncellInit()
end

-- 初始化成功回调：
function onFuncellLuaInitSuccess()
	--Init Success Callback
	print("+++onLuaInitSuccess")
end

-- 初始化失败回调：
function onFuncellLuaInitFailed(msg) --msg:失败的回调信息
	--Init Failed Callback
	print("+++onLuaInitFailed")
	end
```

### 3.2、登录接口（必接）
```lua
-- 登录
function FuncellLuaLogin()
	print("------FuncellLuaLogin")
	doFuncellLogin()
end
-- 登录成功回调
function onFuncellLuaLoginSuccess(userId,userName,token)
	--Login Success Callback
	print("+++onFuncellLuaLoginSuccess")
end
--取消登录回调
function onFuncellLuaLoginCancel()
	--Login Cancel Callback
	print("+++onFuncellLuaLoginCancel")
end
--登录失败回调
function onFuncellLuaLoginFailed(msg)
	--Login Failed Callback
	print("+++onFuncellLuaLoginFailed")
end
```

### 3.3、登出接口（必接）
```lua
-- 帐号退出
function FuncellLuaLogout()
	print("------FuncellLuaLogout")
	doFuncellLogout()
end

-- 帐号退出回调
function onFuncellLuaLogout()
	--Logout Callback
	print("+++onFuncellLuaLogout")
end
```

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

**游戏没有的字段可以设置为 &quot;&quot; 空字符串**
```lua
function FuncellLuaPay(RoleName,RoleId,RoleLevel,ServerName,ServerId,VipLevel,GameGoldBalance,GameUnionName,ItemName,ItemId,ItemCount,ItemDescription,ItemAmount,ExtrasParams,ItemType,OrderId)
	print("------FuncellLuaPay")
	doFuncellPay(RoleName,RoleId,RoleLevel,ServerName,ServerId,VipLevel,GameGoldBalance,GameUnionName,ItemName,ItemId,ItemCount,ItemDescription,ItemAmount,ExtrasParams,ItemType,OrderId)
end
```

| 字段名 | 说明 | 字段名 | 说明 |
| --- | --- | --- | --- |
| RoleName | 角色名 | RoleId | 角色ID |
|RoleLevel | 角色等级 | ServerName | 服务器名 |
| ServerId | 服务器ID | VipLevel | 角色VIP等级 |
| GameGoldBalance | 剩余金币数 | GameUnionName | 游戏公会 |
| ItemName | 商品名 | ItemId | 商品id |
|  ItemCount | 购买元宝数量 | ItemDescription | 商品描述 |
| ItemAmount | 价格/分 | ExtrasParams | 透传参数 |
| ItemType | 商品类型/元宝、钻石 | OrderId | 游戏订单号 |

```lua
--支付成功回调
function onFuncellLuaPaySuccess(cpOrder,sdkOrder,extrasParams)
	--Pay Success Callback
	print("+++onFuncellLuaPaySuccess")
	-- cpOrder:游戏订单号、sdkOrder：平台订单号、extrasParams:透传参数
end

--支付失败回调
function onFuncellLuaPayFail(msg)
	--Pay Fail Callback
	print("+++onFuncellLuaPayFail")
end

--支付取消回调
function onFuncellLuaPayCancel(msg)
	--Pay Cancel Callback
	print("+++onFuncellLuaPayCancel")
end
```

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

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

```lua
--创建角色事件
function FuncellLuaCreatRoleEvent(json)
	print("------FuncellLuaCreatRoleEvent")
	--json数据字段为:usermark(平台登录成功后返回的用户ID)、serverno(服务器ID)、role_id(角色ID)、role_name(角色名)、server_name(服务器名)
	setCreatRoleEventCallback(json)
end

-- ###登录事件：登录游戏并选择了服务器后调用
--创建角色事件
-- LoginEvent
function FuncellLuaLoginEvent(json)
	print("------FuncellLuaLoginEvent")
	--json数据字段为:usermark(平台登录成功后返回的用户ID)、serverno(服务器ID)
	setLoginEventCallback(json)
end

-- ###角色升级事件：角色升级后调用
--角色升级事件
function FuncellLuaRoleLevelUpEvent(json)
	print("------FuncellLuaRoleLevelUpEvent")
	--json数据字段为:usermark(平台登录成功后返回的用户ID)、serverno(服务器ID)、level(角色等级)、role_id(角色ID)、role_name(角色名)、server_name(服务器名)
	setRoleLevelUpEventCallback(json)
end

-- ###角色服务器事件：可在进入游戏主场景时调用
--服务器与角色事件
function FuncellLuaServer_RoleEvent(json)
	print("------FuncellLuaServer_RoleEvent")
	--json数据字段为:usermark(平台登录成功后返回的用户ID)、role_level(角色等级)、role_id(角色ID)、role_name(角色名)、server_name(服务器名)、role_vip_level(VIP等级)、role_gameunion_name(工会)
	setServer_RoleEventCallback(json)
end
```

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

```lua
-- 游戏退出
function FuncellLuaExit()
	print("------FuncellLuaExit")
	doFuncellExit()
end

-- 渠道有退出界面回调
function onFuncellLuaChannelExit()
	print("+++onFuncellLuaChannelExit")
end

-- 渠道无退出界面回调
function onFuncellLuaGameExit()
	print("+++onFuncellLuaGameExit")
end
```

### 3.7获取渠道是否有退出界面（可选）
```lua
-- 获取是否有退出界面
function FuncellLuaGetExitUI()
	print("------FuncellLuaGetExitUI")
	doFuncellGetExitUI()
end
```
返回值：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)