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

posted @ 2015-01-19 18:31  recock  阅读(1114)  评论(1编辑  收藏  举报