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

Cocos2d-x 3.X, Android Studio版添加广点通广告平台,第1张

概述考虑到以下两点: 1. Cocos2d-x从3.7版开始优化对Android Studio的支持,相信这一趋势还会继续。可惜目前相关帮助文档还不完善,很多东西需要自己摸索。 2. 广点通广告平台的官方帮助文档没有针对Cocos2d-x。 所以在此对自己所学所得做一些总结,也希望能帮助到那些处在摸索之中的朋友们。 本文所用cocos2d-x为3.8版,android studio为1.3.2版,广点

考虑到以下两点:

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版添加广点通广告平台所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1073063.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存