考虑到以下两点:
1. Cocos2d-x从3.7版开始优化对AndroID Studio的支持,相信这一趋势还会继续。可惜目前相关帮助文档还不完善,很多东西需要自己摸索。
2. 广点通广告平台的官方帮助文档没有针对Cocos2d-x。
所以在此对自己所学所得做一些总结,也希望能帮助到那些处在摸索之中的朋友们。
本文所用cocos2d-x为3.8版,androID studio为1.3.2版,广点通SDK为4.8版。
准备工作:
1)进入广点通官网,注册账号。注册时需要上传身份z正反面照片(好像还需要手持身份z照片)以及银行账户。然后等待审核。广点通审核时间略长,大概要一个礼拜。
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" /> <application androID: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开始--> <service androID:name="com.qq.e.comm.DownloadService" androID:exported="false" > </service> <activity androID:name="com.qq.e.ads.ADActivity" androID:configChanges="keyboard|keyboardHIDden|orIEntation|screenSize" > </activity> <!--广点通声明2结束--> <activity androID: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>@H_419_55@
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.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); }}@H_419_55@注意我们这里是用代码来创建一个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@H_419_55@
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,"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@H_419_55@
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 callback voID menuCloseCallback(cocos2d::Ref* pSender); // implement the "static create()" method manually CREATE_FUNC(HelloWorld);};#endif // __HELLOWORLD_SCENE_H__@H_419_55@
HelloWorldScene.cpp#include "HelloWorldScene.h"USING_NS_CC;Scene* HelloWorld::createScene(){ // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object auto layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !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 object auto 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 object auto 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 label auto label = Label::createWithTTF("Hello World","Fonts/Marker Felt.ttf",24); // position the label on the center of the screen label->setposition(Vec2(origin.x + visibleSize.wIDth/2,origin.y + visibleSize.height - label->getContentSize().height)); // add the label as a child to this layer this->addChild(label,1); // add "HelloWorld" splash screen" auto sprite = Sprite::create("HelloWorld.png"); // position the sprite on the center of the screen sprite->setposition(Vec2(visibleSize.wIDth/2 + origin.x,visibleSize.height/2 + origin.y)); // add the sprite as a child to this layer this->addChild(sprite,0); return true;}voID HelloWorld::menuCloseCallback(Ref* pSender){ Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0);#endif}@H_419_55@
7)编译并运行。在编译之前需要在AndroID.mk文件里面添加GDTAD.cpp的路径,否则新建的C++文件无法被编译进来。比如我这里可以输入vi ~/documents/HelloWorld/proj.androID-studio/app/jni/AndroID.mk进行添加。最终运行后效果如下图所示:
从效果图中可以看出我们已经在AndroIDManifest.xml里把横屏改成了竖屏。
水平有限,如有不妥,欢迎指正!
参考文献:
[1]广点通官方示例代码。
[2]http://www.jb51.cc/article/p-uuhgkjsr-wg.html
总结以上是内存溢出为你收集整理的Cocos2d-x 3.X, Android Studio版添加广点通广告平台全部内容,希望文章能够帮你解决Cocos2d-x 3.X, Android Studio版添加广点通广告平台所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)