CocosCreator 集成 AnySDK 教程

本文主要介绍怎么在 CocosCreator 项目中集成 AnySDK 。

##本人开发环境

CocosCreator 1.1.1, AnySDK 2.1.2, AnySDK_Framework_JS_Android_2.1.2, MacOS 10.10.3

##集成 AnySDK 详细步骤

由于本人使用 git 对项目进行版本控制管理,所以下列步骤中会有一些与 git 相关的操作。如果你没有使用 git,那么你可以直接忽略下列步骤中与 git 相关的操作。

###获取 AnySDK Framework
安装 AnySDK 客户端,然后在 AnySDK 客户端的【安妮市场】【分类】【框架】中找到 JS(Android) 框架并下载。如下图:

下载完成后打开 JS(Android) 框架文件夹即可看到 AnySDKFiles/Store/Frameworks/AnySDK_Framework_JS_Android_2.1.2/AnySDK_Framework_JS(Android)/ 这样的目录。如下图:

下文统一使用 AnySDK_Framework_JS(Android) 指代 AnySDK Framework 文件目录。

###构建并编译 CocosCreator 项目

下文使用 your-proj 指代你的 CocosCreator 项目路径。

####修改项目中的 gitignore 文件。

删除 your-proj/.gitignore 文件中以下路径:

build/

在 your-proj/.gitignore 文件中添加以下路径:

build/jsb-default/src/
build/jsb-default/res/
build/jsb-default/publish/
build/jsb-default/simulator/

build/jsb-default/frameworks/runtime-src/proj.android/bin/
build/jsb-default/frameworks/runtime-src/proj.android/gen/
build/jsb-default/frameworks/runtime-src/proj.android/obj/
build/jsb-default/frameworks/runtime-src/proj.android/assets/

build/jsb-default/frameworks/cocos2d-x/cocos/platform/android/java/bin/
build/jsb-default/frameworks/cocos2d-x/cocos/platform/android/java/gen/

####构建发布 Android 平台
使用 CocosCreator 打开项目,点击 【项目】【构建发布】,发布平台选择 “Android”, 模板选择 “default”。然后点击 “构建”按钮 对项目进行构建。构建完毕会在 your-proj 目录下生成一个 build/jsb-default/ 目录。

构建完成后,点击 “编译”按钮 对项目进行编译,编译过程大概20分钟左右。编译完成后,安装编译生成的 apk 到手机上查看是否运行正常。

如果在构建和编译过程中出现错误,请参考 CocosCreator 官方的跨平台发布游戏文档

注意:该步骤中的编译操作并不是必须的,只是为了保证你的编译发布 Android 平台相关开发环境已经配置完成。这样在集成 AnySDK 的出现错误的时候,就可以排除开发环境配置相关的问题了。

###获取 anysdk jsb 绑定文件

####添加 anysdk jsb 文件
在 build/jsb-default/frameworks/cocos2d-x/ 目录下新建 anysdk 文件夹,然后拷贝 AnySDK_Framework_JS(Android)/ 目录下的 src 文件夹到新建的 anysdk 文件夹中。

####修改 build-cfg.json 文件
在 build/jsb-default/frameworks/runtime-src/proj.android/build-cfg.json 文件中添加:

{
    "from": "../../cocos2d-x/anysdk/src",
    "to": ""
}

如下图,注意:不要遗漏了添加代码前面分隔的逗号 “,”。

####修改 jsb.js 文件
在 build/jsb-default/frameworks/cocos2d-x/cocos/scripting/js-bindings/script/jsb.js 文件中添加:

if     (jsb.fileUtils.isFileExist('jsb_anysdk_constants.js') || jsb.fileUtils.isFileExist('jsb_anysdk_constants.jsc')) {
    if (cc.sys.os == cc.sys.OS_IOS || cc.sys.os == cc.sys.OS_ANDROID) {
        require('jsb_anysdk_constants.js');
    }
}

if (jsb.fileUtils.isFileExist('jsb_anysdk.js') || jsb.fileUtils.isFileExist('jsb_anysdk.jsc')) {
    if (cc.sys.os == cc.sys.OS_IOS || cc.sys.os == cc.sys.OS_ANDROID) {
        require('jsb_anysdk.js');
    }
}

如下图

###拷贝anysdk framework stl库
####添加 protocols 文件

首先,查看所接入项目的 build/jsb-default/frameworks/runtime-src/proj.android/jni/application.mk 文件第一行找到 stl 库类型设置。 如下:

APP_STL := gnustl_static

然后,进入所接入项目的 build/jsb-default/frameworks/runtime-src/proj.android 目录,新建 protocols 文件夹。根据上面查看到的stl类型,选取 AnySDK_Framework_JS(Android)/framework/protocols_gnustl_static/ 库,然后将该目录下的 androidinclude 文件夹拷贝到 protocols 目录下。

####添加 libPluginProtocol.jar 文件

在 build/jsb-default/frameworks/runtime-src/proj.android/ 目录下新建 libs 文件夹,然后将 build/jsb-default/frameworks/runtime-src/proj.android/protocols/android 目录下的 libPluginProtocol.jar 文件移到 libs 目录下。

####添加 res 文件

将 AnySDK_Framework_JS(Android)/framework/protocols_gnustl_static/ 目录下的 res 文件夹,拷贝到 build/jsb-default/frameworks/runtime-src/proj.android/ 目录下,注意选择合并,避免文件覆盖

###添加 Classes 文件
由于 Creator 使用的是 lite 版本引擎,所有请到本文回复中的 23楼下载官方大神 panda 提供的 anysdk-creator-jsb.zip 绑定文件,然后拷贝到 build/jsb-default/frameworks/runtime-src/Classes 目录下。详情请查看23楼。

###修改 AppDelegate.cpp 文件
在 build/jsb-default/frameworks/runtime-src/Classes/AppDelegate.cpp 文件中添加:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include "jsb_anysdk_basic_conversions.h"
#include "jsb_anysdk_protocols_auto.hpp"
#include "manualanysdkbindings.hpp"
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    sc->addRegisterCallback(register_all_anysdk_framework);
    sc->addRegisterCallback(register_all_anysdk_manual);
#endif

如下图

###修改 Android.mk 文件
在 文件中添加 build/jsb-default/frameworks/runtime-src/proj.android/jni/Android.mk 文件中添加:

$(call import-add-path,$(LOCAL_PATH)/../)
../../Classes/jsb/jsb_creator_auto.cpp \
../../Classes/jsb_anysdk_basic_conversions.cpp \
../../Classes/jsb_anysdk_protocols_auto.cpp \
../../Classes/manualanysdkbindings.cpp
LOCAL_WHOLE_STATIC_LIBRARIES := PluginProtocolStatic
$(call import-module, protocols/android)

如下图,注意:记得在 ../../Classes/AppDelegate.cpp 添加 “\”。

###修改 main.cpp 文件
在 build/jsb-default/frameworks/runtime-src/proj.android/jni/hellojavascript/main.cpp 文件中添加:

#include "PluginJniHelper.h"
using namespace anysdk::framework;
JavaVM* vm;
env->GetJavaVM(&vm);
PluginJniHelper::setJavaVM(vm);

如下图

###修改 AndroidManifest.xml 文件
在 build/jsb-default/frameworks/runtime-src/proj.android/AndroidManifest.xml 文件中添加 AnySDK 所需要的权限:

    <!-- for anysdk start -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <!-- for anysdk end -->

如下图

###修改 AppActivity.java 文件
在 build/jsb-default/frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java 添加:

import com.anysdk.framework.PluginWrapper;
import android.content.Intent; 
import android.os.Bundle;
PluginWrapper.init(this); // for plugins
@Override
protected void onDestroy() {
    PluginWrapper.onDestroy();
    super.onDestroy();
}

@Override
protected void onPause() {
    PluginWrapper.onPause();
    super.onPause();
}

@Override
protected void onResume() {
    PluginWrapper.onResume();
    super.onResume();
}

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

@Override
protected void onNewIntent(Intent intent) {
    PluginWrapper.onNewIntent(intent);
    super.onNewIntent(intent);
}

@Override
protected void onStop() {
    PluginWrapper.onStop();
    super.onStop();
}

@Override
protected void onRestart() {
    PluginWrapper.onRestart();
    super.onRestart();
}

如下图

##在项目中使用AnySDK

###获取 AnySDK 参数
打开 AnySDK 客户端,点击 【打包工具】【游戏列表】【添加游戏】来在 AnySDK 客户端添加游戏项目。添加成功后,就可以获取到使用 AnySDK 需要的参数:appKey、appSecret、privateKey。

###在项目中添加 AnySDK 功能代码

下面给出了我在使用 AnySDK 用过的相关功能代码供大家参考。AnySDK 具体用法请参考官方的客户端接入(JS)文档

// 初始化AnySDk
initAnySDK: function () {
    cc.log("WelcomeScreen.initAnySDK()");
    if (cc.sys.isMobile) {
        //注意:这里appKey, appSecret, privateKey,要替换成自己打包工具里面的值(登录打包工具,游戏管理界面上显示的那三个参数)。
        var appKey = "23BEE66E-48A1-9BF0-CF4A-4DA25FF54082";
        var appSecret = "b3d0c6f406c1f7d097f2036f445589b4";
        var privateKey = "FC69F26761B6C3BEDFCDA8A2D248CC45";
        var oauthLoginServer = "http://oauth.anysdk.com/api/OauthLoginDemo/Login.php";
        var agent = anysdk.agentManager;
        //init
        agent.init(appKey, appSecret, privateKey, oauthLoginServer);
        //load
        agent.loadAllPlugins();
        
        // 开启统计
        cc.log("analytics_plugin.startSession();");
        var analytics_plugin = anysdk.agentManager.getAnalyticsPlugin();
        if (analytics_plugin) {
            analytics_plugin.startSession();
        }
        
        // 开启推送服务
        cc.log("push_plugin.startPush();");
        var push_plugin = anysdk.agentManager.getPushPlugin();
        if (push_plugin) {
            push_plugin.startPush();
        }
    }
},

// 显示横幅广告
showBannerAd: function () {
    cc.log("WelcomeScreen.showBannerAd()");
    if (cc.sys.isMobile) {
        var ads_plugin = anysdk.agentManager.getAdsPlugin(); 
        if (ads_plugin.isAdTypeSupported(anysdk.AdsType.AD_TYPE_BANNER)) {
            ads_plugin.showAds(anysdk.AdsType.AD_TYPE_BANNER);
        } 
    }
},

// 显示插屏广告
showFullScreenAd: function () {
    cc.log("showFullScreenAd()");
    if (cc.sys.isMobile) {
        var ads_plugin = anysdk.agentManager.getAdsPlugin(); 
        if (ads_plugin.isAdTypeSupported(anysdk.AdsType.AD_TYPE_FULLSCREEN)) {
            ads_plugin.showAds(anysdk.AdsType.AD_TYPE_FULLSCREEN);
        } 
    }
},

// 统计事件
logEvent: function () {
    cc.log("logEvent()");
    if (cc.sys.isMobile) {
        var analytics_plugin = anysdk.agentManager.getAnalyticsPlugin();
        if (analytics_plugin) {
            analytics_plugin.logEvent("click_logevent_btn")
        }
    }
},

// 退出游戏
onExitBtnClicked: function () {
    cc.log("onExitBtnClicked()");
    
    // 关闭统计
    cc.log("analytics_plugin.stopSession();");
    if (cc.sys.isMobile) {
        var analytics_plugin = anysdk.agentManager.getAnalyticsPlugin();
        if (analytics_plugin) {
            analytics_plugin.stopSession();
        }
        // 在游戏结束或者适当的时候,调用unloadAllPlugins来卸载SDK插件
        anysdk.agentManager.unloadAllPlugins();
    } 
    
    cc.director.end();// 退出游戏
}

在项目中添加了 AnySDK 相关功能代码后,使用 CocosCreator 编译出 Android APK 母包。

###生成渠道包
在 AnySDK 客户端配置好游戏的渠道、SDK等参数,然后使用上一步骤编译出来的 Android APK 母包生成集成了 SDK 的渠道包。

在这里就不详细说明 AnySDK 客户端的使用了,详情请参考 AnySDK 的官方文档

##如何快速集成 AnySDK

我在 GitHub 上面分享了一个便于在 CocosCreator 项目的 Android 平台快速集成 AnySDK 的项目:anysdk-files-for-ccc 。具体使用方法请参考该项目的 README.md 文件,这里就不详细说明了。

2016-06-27 更新:更新绑定文件为官方大神 panda 提供的 anysdk-creator-jsb.zip 绑定文件。

##总结

本文主要讲解了如何在 CocosCreator 项目的 Android 平台集成 AnySDK ,并提供了一个快速集成方法。ios 平台请参考 AnySDK 的官方文档自行尝试。

本文出自 Eddy’s Blog 转载请注明出处:http://eddy2015.github.io/blog/2016/06/22/ccc-plus-anysdk/

13赞

顶大神,已收藏,需要的时候来看

这个一定要顶。
最好以后还更随creator版本的更新而更新教程。

1赞

:2:真是太好了。要是再来个iOS的就完美了。

盛赞!使用CocosCreator 和 AnySDK 的用户有福了。

膜拜大神~~~

ios 未尝试,你可以参考 AnySDK 相关文档尝试,应该不会有什么大问题,估计应该也是 jsb_anysdk_protocols_auto.cpp 文件需要进行修改。其实我之前用 ccc 1.0 版本的时候,jsb_anysdk_protocols_auto.cpp 文件不会报错的:grin:

赞楼主。说来惭愧,studio时代一直说的一体化一体化,其实只是把几个软件合在一个安装包里面而已,距离我想要的一体化还很远 :cry:

现在Creator要做一体化就容易许多了。AnySDK团队正在给creator做一个扩展插件,按照目前的进度估计7月底能弄完。我先放两张图出来show一下

楼主的教程仍然很有价值。目前AnySDK团队只是“把AnySDK移植到Creator框架上”,还没有开始做真正集成工作流的事情。而深度集成,则需要把楼主说的整理改一下代码、那边改一下manifest.xml,上到javascript和JSON,下到C++和makefile,这些都不应该是用户需要学习和操作的,应该是一键“加入AnySDK打包支持”就能搞定。所以我们的处理脚本应该是照着楼主的文章写下来,自动化就OK啦。

再次感谢 @eddy2015 !

2赞

大赞,太贴心了,祝creator蒸蒸日上。

我靠,这么快:heart_eyes:

谢谢!期待官方的插件:smile:。其实我自己也写了个简单的 Python 的脚本,就是把需要改动的文件 直接拷贝覆盖到新项目中,但使用这个脚本无法做到代码合并(即会覆盖替换掉之前的代码)。不过如果项目使用 git 之类的,还是很容易把代码给手动合并的。

Cocos Creator1.0用 AnySDK框架里的3.10的绑定文件,Cocos Creator 1.1.1 用AnySDK框架里的3.9 的绑定文件就可以了,不需要用他修改的文件

谢谢提醒,上面教程已改正。

试过了,AnySDK框架里的3.5-3.9文件也会报错。

真是不错 坐等更新

楼主,我错了,CocosCreator1.1.1带的引擎版本特殊(lite版),既不是3.9也不是3.10,所以AnySDK框架带的两个版本的脚本绑定文件都没法用~~~~~~

哇塞 ! 牛人越来越多了! :heart_eyes:

嗯,我验证了一下,在 Cocos Creator 1.1.1 用AnySDK框架里的 3.5-3.9 的绑定文件编译是会报错。文章已改回原样了。其实我对自己对 jsb_anysdk_protocols_auto.cpp 文件的改动也不是很放心的,虽然我测试过程中暂时没发现问题。可以暂时先用着,反正下个月底官方插件就出来了:grin:

其实我已经开了另外一个贴请教这个问题: ccc 1.1.1 集成AnySDK 后 jsb_anysdk_protocols_auto.cpp 报错问题 等待官方大神解答。

我iOS也接入成功了。
但是 ads_plugin.showAds(AdsType.AD_TYPE_BANNER);
显示广告的时候一点反应都没有:sweat_smile:
用打包工具打包了,什么该加的也有加了。
正常是不是调用 showAds 就会弹出广告?
第一次接sdk表示很无奈~
@eddy2015