Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Cocos2d-x 3.X, Android Studio版添加广点通广告平台大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

虑到以下两点:

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

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

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


本文所用cocos2d-x为3.8版,android studio为1.3.2版,广点通SDK为4.8版。



准备工作:

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://scheR_987_11845@as.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="@@R_616_10495@ng/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 @R_616_10495@ng APPID = "1101152570";

    //声明广告条容器,广告条和广告位ID
    private static RelativeLayout bAnnerContainer;
    BAnnerView bv;
    public static final @R_616_10495@ng 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);
    }

}

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

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

GDTAD.h

#ifndef CLASSES_GDTAD_H
#define CLASSES_GDTAD_H

class 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,"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 callBACk
    void menuCloseCallBACk(cocos2d::ref* pSender);
    
    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
};

#endif // __HelLOWORLD_SCENE_H__

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 instance
bool 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

}

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


从效果图中可以看出我们已经在AndroidManifest.xml里把横屏改成了竖屏。


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


文献:

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

[2]http://www.voidcn.com/article/p-uuhgkjsr-wg.html

大佬总结

以上是大佬教程为你收集整理的Cocos2d-x 3.X, Android Studio版添加广点通广告平台全部内容,希望文章能够帮你解决Cocos2d-x 3.X, Android Studio版添加广点通广告平台所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。