版本

  • cocos2dx: 2.1.3
  • 91SDK: 3.2.6.1(Android)

适用范围

这里仅仅讨论的是Android的版本

正题

不得不说,91的SDK没有动态库,反而编译起来坑不会那么多,不过既然是Android的整合,坑自然也不会少你的呀,啊哈哈。文档和流程很清楚,可以到91对应的论坛上参考

接入91SDK

加载Lib库

直接的Eclipse中,把 91SDK_LibProject_complete这个项目加进来,然后在你的项目的properties中的Android一栏中增加一个项目依赖,如图,直接Add一个即可


注意Lib项目中的两个jar:alipay_msp.jar android-support-v4.jar,这两个可能会和现有项目中的依赖冲突,安全起见还是用lib包中的好了,如果你本地有,则删除,反正加了项目依赖后这几个文件都会打包到apk中去的。如图。

初始化SDK

以下的代码大部分是抄Demo的,莫见怪
// /////////////////////////////////////////////////////////////////////////////// 这里开始定义91市场的接入// 变量定义,初始化等/* 初始化完成监听端口 */private OnInitCompleteListener m_onInitCompleteListener = null;/* 91的toolbar */private NdToolBar m_NDToolBar = null;/** * 初始化91SDK,在 onCreate 中调用 */private void initSDK91() {// if(AppPreferences.isDebugMode(this)){NdCommplatform.getInstance().ndSetDebugMode(0);// 设置调试模式// }NdCommplatform.getInstance().ndSetScreenOrientation(NdCommplatform.SCREEN_ORIENTATION_AUTO);m_onInitCompleteListener = new OnInitCompleteListener() {@Overrideprotected void onComplete(int ndFlag) {switch (ndFlag) {case OnInitCompleteListener.FLAG_NORMAL:// initActivity(); // 初始化自己的游戏int orient = NdCommplatform.SCREEN_ORIENTATION_LANDSCAPE; // 横屏NdCommplatform.getInstance().ndSetScreenOrientation(orient);break;case OnInitCompleteListener.FLAG_FORCE_CLOSE:default:// 如果还有别的Activity或资源要关闭的在这里处理break;}}};NdAppInfo appInfo = new NdAppInfo();appInfo.setCtx(this);appInfo.setAppId(Constants.SDK_91_APPID);// 应用IDappInfo.setAppKey(Constants.SDK_91_APPKEY);// 应用Key/* * NdVersionCheckLevelNormal 版本检查失败可以继续进行游戏 NdVersionCheckLevelStrict * 版本检查失败则不能进入游戏 默认取值为NdVersionCheckLevelStrict */appInfo.setNdVersionCheckStatus(NdAppInfo.ND_VERSION_CHECK_LEVEL_STRICT);// 初始化91SDKNdCommplatform.getInstance().ndInit(this, appInfo,m_onInitCompleteListener);// 创建Toolbarif (m_NDToolBar == null) {m_NDToolBar = NdToolBar.create(this,NdToolBarPlace.NdToolBarRightMid);}m_NDToolBar.show();}/** * 清理91数据 */private void cleanSDK91() {// 移除监听if (m_onInitCompleteListener != null)m_onInitCompleteListener.destroy();// 清理工具条if (m_NDToolBar != null)m_NDToolBar.recycle();}
这里特别要注意,91的Toolbar一定要在初始化后调用,否则会报资源加载出错的Exception,然后程序就崩了,切记
这两个函数,分别在onCreate和onDestroy中调用即可。一个是初始化的,一个是销毁清理用的。

登录接入

登录这里其实有个坑,呃,我还没跨过去,只是有解决思路,但是后来我把cpp中的代码稍微改了下,就暂时绕过去了,后面会讲到。
// 登录监听private OnLoginProcessListener m_onLoginProcessListener = null;/** * 91帐号登录 *  */private void SDKND91AccountLogin() {Activity act = this;m_onLoginProcessListener = new OnLoginProcessListener() {@Overridepublic void finishLoginProcess(int code) {String tip = "";// hideLoading();JSONObject prms = new JSONObject();// 得到用户昵称try {// 设置请求业务类型为登录请求prms.put("requestType", Constants.REQ_LOGIN);prms.put("retcode", "-1");// 登录的返回码检查if (code == NdErrorCode.ND_COM_PLATFORM_SUCCESS) {// 得到用户信息,返回到cocos2dx中tip = "登录成功";// actInstance.runOnUiThread(new Runnable() {// public void run() {prms.put("retcode", "0");prms.put("nickname", NdCommplatform.getInstance().getLoginNickName());prms.put("account", "91_"+ NdCommplatform.getInstance().getLoginUin());// }// });// 账号登录成功,测试可用初始化玩家游戏数据// 有购买漏单的此时可向玩家补发相关的道具} else if (code == NdErrorCode.ND_COM_PLATFORM_ERROR_CANCEL) {tip = "取消登录";} else {tip = "登录失败,错误代码:" + code;}// 把数据返回给客户端AndroidNDKHelper.SendMessageWithParameters(Constants.SDKBussinessCallback, prms);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}Toast.makeText(actInstance, tip, Toast.LENGTH_SHORT).show();}};// showLoading();NdCommplatform.getInstance().ndLogin(this, m_onLoginProcessListener);}
这里的登录函数需要有个监听用来响应登录状态回调,我就不展开了。关于 AndroidNDKHelper,这个挺好用的,可以在cpp中直接调用和底层NDK的交互,并且支持Android和iOS两个版本,不用直接写那个JNI的调用还是很爽的,虽然有JNIHelper,但是写起来还是比较晦涩冗长,关键是可以在cpp中统一代码调用两个平台的NDK。推荐大家用下,Github上也有源代码。
这里是登录的代码,如果要在cocos2dx中调用的话,只需要登录的时候调用JNI,然后JNI去调用这个函数即可,后面的就是SDK的事情了,登录完成后会在Listener中回调的,只要回调回cocos2dx中通知下即可。不过注意,这里有个小坑,就是貌似回调到cpp中后,可能不是主线程(虽然我JAVA的debug中看到的线程号是主线程),所以如果像这样做的话,cpp中的响应不能有UI的操作,否则直接崩你没商量。我这里偷了个懒,把cpp中的UI操作全都注释了,就修改了个变量的状态,然后主线程定时器扫到这个变量状态变化后,会调用对应应用登录的操作,这里就切换过去了。在360接入的时候,貌似没有这种线程问题,可能360的SDK登录是同步的,而91这个是登录状态起线程异步回调的,没研究过,如果有谁知道知会一声,不胜感激。不知道把91这个模块封装到一个独立的Activity中,然后通过Intent传递数据是否能解决cpp中UI线程的问题,因为即使我用this.runOnUiThread来包一层也还是有问题。

接入支付

支付的话,91提供的种类还是相当繁多的!我这里使用的代币充值,就是先充成91币,然后再和应用结算。需要在支付的时候填入对应的coins,当然需要在91的后台配置下和软妹币的兑换比例,然后填入你需要充值的游戏内的东西即可(也可以是对应的商品价格)。服务器端的回调通知不在本篇的讨论范围。
太简单了,代码就不贴了,给个对应的详细介绍地址好了,接91的应该都知道吧,给没注意的小白看下: 请猛击我

更多相关文章

  1. Android(安卓)IPC 通讯机制源码分析
  2. Android(安卓)NDK 调用C
  3. android实现图片平铺效果&WebView多点触控实现缩放
  4. Android中一个Activity调用另一个Activity — Intent对象的使用
  5. Android横竖屏切换不重新调用onCreate()
  6. Android的电源管理
  7. Android(安卓)Studio下ActionBar示例
  8. Android(安卓)EditText自动获取焦点并弹出软键盘,解决EditText在
  9. Android基础面试题

随机推荐

  1. Android利用Timer实现倒计时效果小demo
  2. Android开启adb root 和 Console Root
  3. Android InputStream转Bitmap
  4. Android跑Monkey必备代码
  5. Android TimePickerDialog(原生安卓时间选
  6. Android 自定义AlertDialog
  7. android开发问题总结
  8. Android 中延迟执行的小结
  9. android动态申请拍照获取照片权限
  10. 徽章系列1: Top 30 android 开源项目徽章