CocosCreator 集成 AnySDK 教程

本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/creator-anysdk.html

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

本人开发环境

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

Android 平台集成 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 文件

由于 CocosCreator 1.1.1 使用的是 lite 版本引擎,所以不能使用 AnySDK_Framework_JS(Android)/3.10及以上/ 目录下的文件。请下载 anysdk-files-for-ccc,然后把 anysdk-files-for-ccc/build/jsb-default/frameworks/runtime-src/Classes/ 目录下的所有文件(除 AppDelegate.cpp 外),拷贝到 build/jsb-default/frameworks/runtime-src/Classes 目录下。

修改 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 文件,这里就不详细说明了。

总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容