Cocos2d-JS 项目接入 触控广告平台(基于anysdk2.0.2)
本文以Cocos2d-JS项目作为示例,讲解如何集成AnySDK-JS。
一、如何创建项目我就省略了,直接进入主题。
1.1 首先,我需要下载anysdk框架包,下载地址:http://www.anysdk.com/downloads
选择AnySDK Framework for JS下载。
将下载下来的AnySDK_Framework_JS.zip文件解压,目录如下:
其中framework目录下,有三个版本的stl库。根据当前项目使用的stl库选取相应的stl库。
(开发者可以在工程目录下jni/application.mk文件第一行找到stl库类型设置。一般为:gnustl_static)
1.2 添加anysdk-jsb绑定文件
src下面则是一个anysdkConst.js文件,该文件是对应C++里面定义的枚举变量。(使用的时候,添加到project.json里面)
"jsList" : [ "src/resource.js", "src/anysdkConst.js", "src/app.js" ]
因为我们是使用Cocos2d-JS 3.x创建的项目,所有我们选择3.x的目录。
二、 配置AnySDK Framework到项目中
2.1、拷贝anysdk framework stl库到protocols文件夹
首先,查看anysdkTest项目的frameworks/runtime-src/proj.android/jni/application.mk
文件第一行找到stl库类型设置。 如下图:
然后,进入anysdkTest项目的frameworks/runtime-src/proj.android
目录,新建protocols文件夹。根据上面查看到的stl类型,选取AnySDK_Framework_JS/framework/protocols_gnustl_static
库,然后将该目录下的android和include文件夹拷贝到protocols目录。
(注意:接下来,再把protocols文件夹拷贝一份到frameworks/js-bindings目录,不然后面Android.mk
文件会出错)
2.2、 将AnySDK_Framework_JS/framework/protocols_gnustl_static
目录下的res文件,拷贝到proj.android/res
目录下,注意选择合并,避免文件覆盖。
2.3、将AnySDK_Framework_JS/3.x
目录下的文件拷贝到frameworks/runtime-src/Classes目录下
2.4、编辑proj.android/jni/Android.mk
文件
在Android.mk第一行 LOCAL_PATH := $(call my-dir) 下面新加一行代码
LOCAL_PATH := $(call my-dir)
$(call import-add-path,$(LOCAL_PATH)/../)
在LOCAL_SRC_FILES新增 两个文件: autoanysdkbindings.cpp 和 manualanysdkbindings.cpp,例:
LOCAL_SRC_FILES := \ ../../Classes/protobuf-lite/google/protobuf/io/coded_stream.cc \ ... ../../Classes/autoanysdkbindings.cpp \ ../../Classes/manualanysdkbindings.cpp \ javascript/Runtime_android.cpp \ javascript/main.cpp
在LOCAL_C_INCLUDES 新增目录:protocols/android 和 protocols/include,例:
LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/../../Classes/runtime \ $(LOCAL_PATH)/../../Classes/protobuf-lite \ $(LOCAL_PATH)/../protocols/android \ $(LOCAL_PATH)/../protocols/include \ $(LOCAL_PATH)/../../Classes
新增 static lib, 例:
LOCAL_WHOLE_STATIC_LIBRARIES += PluginProtocolStatic
新增 modules, 例:
$(call import-module,protocols/android)
2.5、增加ADK_MODULE_PATH:
3.x, 修改 build-cfg.json文件(也就是加上: "" ):
"ndk_module_path" :[ "../../js-bindings", "../../js-bindings/external", "../../js-bindings/cocos2d-x", "../../js-bindings/cocos2d-x/cocos", "../../js-bindings/cocos2d-x/external", "" ],
2.6、找到proj.android/libs文件夹,然后将AnySDK_Framework_JS/framework/protocols_gnustl_static/android
目录下的libPluginProtocol.jar拷贝到该目录下。
2.7、添加设置javaVM代码
编辑proj.android/jni/javascript/main.cpp
文件。如下:
using namespace cocos2d; #include "PluginJniHelper.h" //添加代码 using namespace anysdk::framework; //添加代码 void cocos_android_app_init (JNIEnv* env, jobject thiz) { LOGD("cocos_android_app_init"); AppDelegate *pAppDelegate = new AppDelegate(); JavaVM* vm; //添加代码 env->GetJavaVM(&vm); //添加代码 PluginJniHelper::setJavaVM(vm); //添加代码 }
cocos2d-js-v3.1之前版本(例如3.0在frameworks/js-binding/cocos2d-x/cocos/platform/android/javaactivity.cpp):
#include "../../../../protocols/android/PluginJniHelper.h" #define LOG_TAG "main" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) using namespace cocos2d; using namespace anysdk::framework; jint JNI_OnLoad(JavaVM *vm, void *reserved) { JniHelper::setJavaVM(vm); PluginJniHelper::setJavaVM(vm); return JNI_VERSION_1_4; }
注:因为setJavaVM需要在onCreate之前,所以写在JNI_OnLoad里肯定没错。 cocos2d-js-v3.1(对应的是cocos2d-x 3.3rc0)及其以上版本的cocos_android_app_init是在onCreate之前的,所以也可以写在这里。3.x版本头文件需要写全 路径,例如js v3.0版本#include "../../../../protocols/android/PluginJniHelper.h"
2.8、配置AndroidManifest.xml 添加框架需要的权限
<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" />
2.9、在JAVA层初始化AnySDK Framework框架
首先找到游戏工程的主Activity,以Cocos2d-x引擎游戏为例,主Activity即是继承了cocos2dxActivity的Activity。 并在主Activity的onCreate()方法中新增如下代码来初始化AnySDK Framework:修改proj.android/src/org/cocos2dx/javascript/AppActivity.java
文件。
import com.anysdk.framework.PluginWrapper; //添加的代码 import android.content.Intent;//添加的代码 public class MainActivity extends Activity{ protected void onCreate(Bundle savedState) { super.onCreate(savedState); PluginWrapper.init(this); // for plugins 添加的代码 }
重写Activity生命周期相关方法,代码如下:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); PluginWrapper.onActivityResult(requestCode, resultCode, data); } @Override protected void onResume() { super.onResume(); PluginWrapper.onResume(); } @Override public void onPause(){ PluginWrapper.onPause(); super.onPause(); } @Override protected void onNewIntent(Intent intent) { PluginWrapper.onNewIntent(intent); super.onNewIntent(intent); }
三、 配置anysdk-jsb文件到项目中
修改frameworks/runtime-src/Classes
下的AppDelegate.cpp文件
在 sc->start(); 这一行之前 新增:
sc->addRegisterCallback(register_all_autoanysdkbindings); sc->addRegisterCallback(register_all_anysdk_manual);
并引用对应的头文件:
#include "autoanysdkbindings.hpp" #include "manualanysdkbindings.hpp"
修改结果如图:
在完成anysdk的集成后,我们需要为anysdk进行一些配,游戏管理、渠道、sdk管理等!
anysdk配置(省略)
四、AnySDK使用
AnySDK集成完成后,和AnySDK配置好后,我们来编写代码,使用我们要集成的SDK。 让我们回到我们的app.js文件。
4.1. 初始化anysdk
在app.js文件的合适位置加入下面代码,初始化anysdk。appKey等参数来自下图中红色区域
var appKey = "EDAB0B5C-81FD-7718-0484-D861196DA227"; var appSecret = "76d97fcf7ef02e2e6aa487ab5821c0ca"; var privateKey = "6ECF2C672E23435D637383C59851E363"; var oauthLoginServer = "http://oauth.anysdk.com/api/OauthLoginDemo/Login.php";
4.2. 使用各个接口
1、首先要获取代理,并初始化:
var agent = anysdk.AgentManager.getInstance(); // init agent.init(appKey,appSecret,privateKey,oauthLoginServer); // load agent.loadAllPlugins();
2、获取各个插件:
var user_plugin = agent.getUserPlugin(); //用户系统 var iap_plugins = agent.getIAPPlugin(); //支付系统 var share_plugin = agent.getSharePlugin(); //分享系统 var ads_plugin = agent.getAdsPlugin(); //广告系统 var social_plugin = agent.getSocialPlugin(); //社交系统 var push_plugin = agent.getPushPlugin(); //推送系统 var analytics_plugin = agent.getAnalyticsPlugin(); //统计系统
3、使用分享插件
var share_plugin = agent.getSharePlugin(); share_plugin.setResultListener(this.onShareResult, this); var info = { title : "ShareSDK是一个神奇的SDK", titleUrl : "http://sharesdk.cn", site : "ShareSDK", siteUrl : "http://sharesdk.cn", text : "ShareSDK集成了简单、支持如微信、新浪微博、腾讯微博等社交平台", comment : "无" } share_plugin.share(info); //下面是添加的监听函数 onShareResult:function(code, msg){ cc.log("share result, resultcode:"+code+", msg: "+msg); switch ( code ) { case ShareResultCode.kShareSuccess: //do something break; case ShareResultCode.kShareFail: //do something break; case ShareResultCode.kShareCancel: //do something break; case ShareResultCode.kShareNetworkError: //do something break; } }
4、使用广告插件(轻松接入触控广告平台)
var ads_plugin = agent.getAdsPlugin(); ads_plugin.setAdsListener(this.onAdsListener, this); if(ads_plugin.isAdTypeSupported(AdsType.AD_TYPE_BANNER)) { ads_plugin.showAds(AdsType.AD_TYPE_BANNER); } if( ads_plugin.isAdTypeSupported(AdsType.AD_TYPE_FULLSCREEN) ) { ads_plugin.showAds(AdsType.AD_TYPE_FULLSCREEN) } if( ads_plugin.isAdTypeSupported(AdsType.AD_TYPE_MOREAPP) ) { ads_plugin.showAds(AdsType.AD_TYPE_MOREAPP) } if( ads_plugin.isAdTypeSupported(AdsType.AD_TYPE_OFFERWALL) ) { ads_plugin.showAds(AdsType.AD_TYPE_OFFERWALL) } //下面是添加的监听函数 onAdsListener:function( code, msg ){ print("on ads action listener.") if( typeof(code) == "number" ) { cc.log("show ads result code:"+code) cc.log("show ads result message:"+msg) //msg可能为空 } else { cc.log("get ads points:"+msg) //此时code的类型 ProtocolAds } }
备注:有一些广告支持多个banner和插屏广告,这时可以用第二个参数index, 1表示添加的第一个banner广告,2表示添加的第二个bannner广告
ads_plugin.showAds(AdsType.AD_TYPE_BANNER, 1)
隐藏banner广告(第二个参数index可以不填,会默认为1)
ads_plugin.hideAds(AdsType.AD_TYPE_BANNER)
预加载插屏广告(第二个参数index可以不填,会默认为1)
ads_plugin.preloadAds(AdsType.AD_TYPE_FULLSCREEN)
有积分广告一般有精品广告(AD_TYPE_MOREAPP)和积分墙广告(AD_TYPE_OFFERWALL)两种。
var points = ads_plugin.queryPoints(); //查询积分 ads_plugin.spendPoints(points); //消费积分
5、卸载SDK插件
agent.unloadALLPlugin(); //或者 anysdk.AgentManager.end();
参考 AnySDK Framework 2.0.0版本在cocos2d-x js中,支付、分享、广告等系统使用的各个接口。 http://docs.anysdk.com/IapsystemJS
五、打包 & 测试(省略)
下面是一个自己用cocos2d-js做的一个猜游戏,已用anysdk集成了触控广告:http://pan.baidu.com/s/1qWPYbfu