考虑到以下两点:

1. Cocos2d-x从3.7版开始优化对Android Studio的支持,相信这一趋势还会继续。可惜目前相关帮助文档还不完善,很多东西需要自己摸索。

2. 广点通广告平台的官方帮助文档没有针对Cocos2d-x。

所以在此对自己所学所得做一些总结,也希望能帮助到那些处在摸索之中的朋友们。

本文所用cocos2d-x为3.8版,android studio为1.3.2版,广点通SDK为4.8版。(插播广告:如需添加IOS版广告平台请戳这里)

准备工作:

1)进入广点通官网,注册账号。注册时需要上传身份证正反面照片(好像还需要手持身份证照片)以及银行账户。然后等待审核。广点通审核时间略长,大概要一个礼拜。

2)审核通过后就可以创建应用和广告位。

3)下载广点通安卓版SDK。广点通的SDK文件夹里有示例代码,可以打开看一看,官网上也帮助文档,但是没有针对Cocos2d-x的。

开干正事:

1)在搞懂如何添加之前,建议不要直接在自己的工程里添加,最好新建一个HelloWorld项目用于试验。关于如何新建一个Android Studio版的HelloWorld项目,请参考博主另一篇博文。

2)打开下载下来的广点通文件夹,复制其中的GDTUnionSDK.4.8.509.jar文件,并拷贝到新建的HelloWorld项目下proj.android-studio->app->libs->armeabi文件夹中(该文件夹只有在第一步中完成编译之后才会出现)。并在Android Studio中打开HelloWorld项目,找到GDTUnionSDK.4.8.509.jar(在jiniLibs->armeabi下面),右击,选择Add As Library。这样就把广点通SDK添加到我们的项目中了。

3)在Android Studio中打开AndroidManifest.xml文件,往里面添加广点通权限声明和Activity声明。添加完后完整代码如下所示:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.istudy.HelloWorldGDT"android:installLocation="auto"><!--广点通声明1开始--><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.READ_PHONE_STATE"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--广点通声明1结束--><uses-feature android:glEsVersion="0x00020000" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"><!-- Tell Cocos2dxActivity the name of our .so --><meta-data android:name="android.app.lib_name"android:value="cocos2dcpp" /><!--广点通声明2开始--><serviceandroid:name="com.qq.e.comm.DownloadService"android:exported="false" ></service><activityandroid:name="com.qq.e.ads.ADActivity"android:configChanges="keyboard|keyboardHidden|orientation|screenSize" ></activity><!--广点通声明2结束--><activityandroid:name="org.cocos2dx.cpp.AppActivity"android:screenOrientation="portrait"android:configChanges="orientation|keyboardHidden|screenSize"android:label="@string/app_name"android:theme="@android:style/Theme.NoTitleBar.Fullscreen" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-permission android:name="android.permission.INTERNET"/></manifest>

4)在Android Studio里打开AppActivity,往里面添加显示广告的Java代码。但是由于我们Cocos2d-x的场景都是用C++实现的,所以我们在这里需要利用Handler来做接口。这和官方帮助文档不同。添加完后完整代码如下所示:

AppActivity

package org.cocos2dx.cpp;  import org.cocos2dx.lib.Cocos2dxActivity;  import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.RelativeLayout;  import com.qq.e.ads.banner.ADSize;
import com.qq.e.ads.banner.AbstractBannerADListener;
import com.qq.e.ads.banner.BannerView;  public class AppActivity extends Cocos2dxActivity {  //声明应用ID  public static final String APPID = "1101152570";  //声明广告条容器,广告条和广告位ID  private static RelativeLayout bannerContainer;  BannerView bv;  public static final String BannerPosID="9079537218417626401";  //声明handler用于发送消息  private static Handler handler;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  //创建广告条容器  bannerContainer = new RelativeLayout(this);  RelativeLayout.LayoutParams parentLayoutParams = new RelativeLayout.LayoutParams(  RelativeLayout.LayoutParams.WRAP_CONTENT,  RelativeLayout.LayoutParams.WRAP_CONTENT);  this.addContentView(bannerContainer, parentLayoutParams);  //加载或卸载广告  handler = new Handler() {  @Override  public void handleMessage(Message msg) {  switch (msg.what) {  case 0:// showBannerAd()  if (bannerContainer.getChildCount() == 0) {  //初始化并加载广告条  initBanner();  bv.loadAD();  }else{  if (bv != null) {  bv.setVisibility(View.VISIBLE);  bv.loadAD();  }  }  break;  case 1: //hideBannerAd()  if (bv != null) {  doCloseBanner();  }  break;  default:  break;  }  }  };  }  private void initBanner() {  bv = new BannerView(this, ADSize.BANNER, APPID, BannerPosID);  bv.setRefresh(30);bv.setShowClose(true);//一定要有这个关闭按钮,否则某些应用商店不给通过,虽然官方示例代码中没有。本人就被坑过一次。  bv.setADListener(new AbstractBannerADListener() {  @Override  public void onNoAD(int arg0) {  Log.i("AD_DEMO", "BannerNoAD,eCode=" + arg0);  }  @Override  public void onADReceiv() {  Log.i("AD_DEMO", "ONBannerReceive");  }  });  //添加广告并设置它的位置  RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(  RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);  //layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);  layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);  bannerContainer.addView(AppActivity.this.bv, layoutParams);  }  //刷新  private void doRefreshBanner() {  if (bv == null) {  initBanner();  }  bv.loadAD();  }  //关闭  private void doCloseBanner() {  bannerContainer.removeAllViews();  bv.destroy();  bv = null;  }  //打开和关闭广告接口  public static void showBannerAd() {  handler.sendEmptyMessage(0);  }  public static void hideBannerAd() {  handler.sendEmptyMessage(1);  }  }  

注意我们这里是用代码来创建一个RelativeLayer布局对象来作为广告条容器的,而非通过布局文件xml来实现的,这一点和官方文档也不同。

5)在Cocos2d-x的Classes下面新建一个类,命名为GDTAD,在里面通过jni把Java的广告开关转换成了C++函数,以便在Cocos2d-x场景里调用。完整代码如下:

GDTAD.h

#ifndef CLASSES_GDTAD_H
#define CLASSES_GDTAD_Hclass GDTAD {
public:static void showBannerAd();static void hideBannerAd();};#endif //CLASSES_GDTAD_H
GDTAD.cpp
#include "GDTAD.h"
#include "cocos2d.h"USING_NS_CC;#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#include <jni.h>const char* AppActivityCalssName = "org/cocos2dx/cpp/AppActivity";//显示广告条
void GDTAD::showBannerAd()
{cocos2d::JniMethodInfo showBanner;if (cocos2d::JniHelper::getStaticMethodInfo(showBanner, AppActivityCalssName, "showBannerAd", "()V")) {showBanner.env->CallStaticVoidMethod(showBanner.classID, showBanner.methodID);}else{log("jni:showBannerStatic false");}
}//隐藏广告条
void GDTAD::hideBannerAd()
{cocos2d::JniMethodInfo hideBanner;if (cocos2d::JniHelper::getStaticMethodInfo(hideBanner, AppActivityCalssName, "hideBannerAd", "()V")) {hideBanner.env->CallStaticVoidMethod(hideBanner.classID, hideBanner.methodID);}else{log("jni:hideBannerStatic false");}
}#else//广告条
void GDTAD::showBannerAd()
{log("showBannerAd() called");return;
}void GDTAD::hideBannerAd()
{log("hideBannerAd() called");return;
}#endif

6)接下来就可以愉快的在Cocos2d-x场景里添加广告了。这里我们在HelloWorld场景的最上端添加一个广告条,完整代码如下

HelloWorldScene.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"
#include "GDTAD.h"class HelloWorld : public cocos2d::Layer
{
public:static cocos2d::Scene* createScene();virtual bool init();// a selector callbackvoid menuCloseCallback(cocos2d::Ref* pSender);// implement the "static create()" method manuallyCREATE_FUNC(HelloWorld);
};#endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
#include "HelloWorldScene.h"USING_NS_CC;Scene* HelloWorld::createScene()
{// 'scene' is an autorelease objectauto scene = Scene::create();// 'layer' is an autorelease objectauto layer = HelloWorld::create();// add layer as a child to scenescene->addChild(layer);// return the scenereturn scene;
}// on "init" you need to initialize your instance
bool HelloWorld::init()
{//// 1. super init firstif ( !Layer::init() ){return false;}Size visibleSize = Director::getInstance()->getVisibleSize();Vec2 origin = Director::getInstance()->getVisibleOrigin();/// 2. add a menu item with "X" image, which is clicked to quit the program//    you may modify it.// add a "close" icon to exit the progress. it's an autorelease objectauto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,origin.y + closeItem->getContentSize().height/2));// create menu, it's an autorelease objectauto menu = Menu::create(closeItem, NULL);menu->setPosition(Vec2::ZERO);this->addChild(menu, 1);/// 3. add your codes below...//添加广告条GDTAD::showBannerAd();// add a label shows "Hello World"// create and initialize a labelauto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);// position the label on the center of the screenlabel->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - label->getContentSize().height));// add the label as a child to this layerthis->addChild(label, 1);// add "HelloWorld" splash screen"auto sprite = Sprite::create("HelloWorld.png");// position the sprite on the center of the screensprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));// add the sprite as a child to this layerthis->addChild(sprite, 0);return true;
}void HelloWorld::menuCloseCallback(Ref* pSender)
{Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)exit(0);
#endif}

7)编译并运行。在编译之前需要在Android.mk文件里面添加GDTAD.cpp的路径,否则新建的C++文件无法被编译进来。比如我这里可以输入vi ~/Documents/HelloWorld/proj.android-studio/app/jni/Android.mk进行添加。最终运行后效果如下图所示:


从效果图中可以看出我们已经在AndroidManifest.xml里把横屏改成了竖屏。(这个图片没有更新,更新后广告条左上角会有一个叉叉,用来关闭广告)。

水平有限,如有不妥,欢迎指正!

参考文献:

[1]广点通官方示例代码。

[2]http://blog.csdn.net/u014078216/article/details/48931565

Cocos2d-x 3.X, Android Studio版添加广点通广告平台相关推荐

  1. Cocos2d-x 3.X, IOS版添加广点通广告平台

    苹果自己的广告平台iAD在中国不好使,获取不到广告,所以必须搞个本土广告平台.首先想到的是广点通.可是广点通官方文档里没有针对Cocos2d-x的版本,所以只好自己摸索.在添加过程中确实遇到了不少问题 ...

  2. android广告弹窗插屏,cocos2dx android添加广点通广告平台的---插屏广告

    方式一: 1. 在cocos2dx编译完成的项目(proj.android)加入 GDTUnionSDK.4.8.524.min.jar广点通jar包. 2. 添加权限声明 3.添加activity, ...

  3. Cocos2d-x 3.X, IOS版添加广点通插屏广告

    之前写了篇Cocos2d-x 3.X, iOS版添加广点通广告.但是那篇只提到了广告条的集成(有需要的,请戳这里).不少网友反映出对插屏广告的需求.所以在这里就把插屏广告的集成也写一遍.其实方法是一样 ...

  4. unity3d 5.2 添加广点通广告

    今天向项目中添加插屏广告.之前找了一圈,看评论说腾讯的广点通还可以,于是决定放弃有米,试试. 回到正题,之前还没试过用unity3d和java交互.于是先找了一圈的资料.这里先BS下腾讯,你妹的有的是 ...

  5. android 腾讯广告接入,cocos2dx 3.x android studio 添加广点通广告

    1,接入广告条 按照官方文档接入的时候遇到个问题,官方文档中是使用的布局文件来显示广告条,但是cocos2dx 没有使用布局文件,所以这里需要我们在代码中手动创建一个布局容器来显示广告条,代码如下: ...

  6. android studio怎么添加按钮,Android Studio 工具栏添加常用按钮

    本文中 Android Studio 的版本为 android Studio 2.2 ,操作系统为 Windows,如有操作不同,可能是版本差异. 在工具栏中添加一些常用的按钮,如设置.DDMS,有利 ...

  7. Android 移动开发——第十三章——个人理财通(Android Studio 版)

    Android 移动开发--第十三章--个人理财通(Android Studio 版) 下载链接: 个人理财通--Android Studio 版

  8. 【三方库】大华乐橙Demo(Android Studio版)

    大华乐橙Demo(Android Studio版) 注: 非官方Demo.此工程为笔者用官方Eclipse工程Demo转换成的AS工程.自用,同时也提供给需要的朋友.此工程不代表任何大华乐橙官方观点, ...

  9. 在java中添加源_关于Java:如何在Android Studio中添加链接的源文件夹?

    在Eclipse中,我可以将源文件夹作为"链接的源文件夹"添加到我的android项目中. 如何在Android Studio中实现同一目的? 或者是否可以添加外部文件夹以构建gr ...

最新文章

  1. java正则 括号_java正则表达式获取大括号小括号内容并判断数字和小数亲测可用...
  2. 【Boost】boost库asio详解2——io_service::run函数无任务时退出的问题
  3. PC问题-VMware Workstation出现“文件锁定失败”
  4. laravel 中添加自定义辅助函数helpers.php
  5. javascript-模板方法模式-提示框归一化插件
  6. java很贵可以用before代替吗_Java内存模型与Volatile,Happen-Before原则等
  7. 创建mysql用户并在单个数据库上赋权
  8. docker的macvlan网络
  9. 2017.3CCCC团体程序设计天梯赛初赛总结
  10. Linux路由器流量统计系统
  11. 图像处理与机器视觉行业分析
  12. 5个球放入3个箱子_排列组合问题,把5个相同的球放到三个相同的盒子里,要求每个盒子都有球,则不同的放球方法是多少?...
  13. Java银行管理系统
  14. Android:国家气象局提供的天气预报接口(完整Json接口)
  15. 柯尔特python_柯字取名的含义是什么
  16. 7-36 复数四则运算 (15分)【超级详细解析】
  17. Java多线程(总)
  18. Json diff 定制化需求
  19. 单片机c语言屏蔽第四位,单片机C语言学习
  20. win10离线安装net framework 3.5(自己测试的两种好用的方法)

热门文章

  1. 【蓝桥杯】历届试题 对局匹配(贪心)
  2. webview加载的页面和浏览器渲染的页面不一致_QQ音乐Android客户端Web页面通用性能优化实践...
  3. 开源真香 离线识别率高 Python 人脸识别系统
  4. 三极管的简单应用实验【Multisim仿真】
  5. Java从入门到入坟_Day01
  6. 清风电子—keil5,没有找到No ULINK Device found
  7. 人像照片后期调色效果lr预设
  8. Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优
  9. Python 搭建云服务和小程序“云办公”
  10. 虚拟机打开安卓模拟器VT