Cocos2d-x 2.x android下集成admob广告(一)顶部banner

来源:互联网 发布:java怎么使用graphics 编辑:程序博客网 时间:2024/06/05 00:52

Chapter1:
1、创建一个 cocos2d-x项目 admob_test
2、用Eclipse import-> admob_test\proj.android
3、Import ->libcocos2dx
选择 目录:……/cocos2d-x2.x/cocos2dx/platform/andorid/java,导入;
4、编译CPP files
4.1选择proj.andorid目录 ,启动终端;
4.2设置ANDROID_SDK_ROOT 和 NDK_ROOT
export ANDROID_SDK_ROOT=”/Users/SamMa/Desktop/AndroidStudio/sdk”
export NDK_ROOT=”/Users/SamMa/Desktop/AndroidStudio/android-ndk-r10d”
4.3 编译 build_native.sh

5、用Eclipse真机测试
选择admob_test 项目右键-> Build Configruation->Target 选择每次提示选择调试设备
选择admob_test 项目右键-> Run as Android App

Chapter2:admob Account
1、申请 admob account
2、创建APP,准备banner 广告,插屏广告;

Chapter3: Implementing AdMob in Android cocos2d-x 2.x based game
1、下载并安装 “Google Play Services” SDK
Eclipse 选择Android SDK Manager 下载 Google Play Services
2、Eclipse Import :google_play_services_lib
路径:/Users/SamMa/Desktop/AndroidStudio/sdk/extras/google/google_play_services/libproject/
3、在项目代码中引用google_play_services_lib
点ADD
添加后
4、尽量使 all projects (admobTest, google-play-services_lib and libcocos2dx) have the same build target (但 Android 4.42 、5.0.1、 5.0.1 在此例真机运行OK).
5、修改清单文件
参考:https://developers.google.com/admob/android/eclipse
5.1 AndroidManifest.xml:

<!-- Include required permissions for Google Mobile Ads to run-->    <uses-permission android:name="android.permission.INTERNET"/>    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application>        <!--This meta-data tag is required to use Google Play Services.-->        <meta-data android:name="com.google.android.gms.version"        android:value="@integer/google_play_services_version" />        <!--Include the AdActivity configChanges and theme. -->        <activity android:name="com.google.android.gms.ads.AdActivity"            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"            android:theme="@android:style/Theme.Translucent" />    </application>

需要完成以下三项更改:

为 INTERNET 和 ACCESS_NETWORK_STATE 添加两个 <uses-permission> 标记。INTERNET 的标记是必需的,用于访问互联网以发送广告请求。 ACCESS_NETWORK_STATE 是可选的,用于在发出广告请求前检查是否有可用的互联网连接。添加一个引用 Google Play 服务版本的 <meta-data> 标记。这会让 Android 知道您的应用希望使用哪个版本的服务。添加具有 configChanges 和 theme 属性的 <activity> 元素。当横幅广告被点击或展示插页式广告时,SDK 会使用此活动,而且与其他活动一样,必须在展示之前在清单中声明此活动。

5.2 为应用指定广告单元 ID -修改BannerExample/res/values/strings.xml

<string name="banner_ad_unit_id">ca-app-pub-3940256099942544/6300978111</string>

上面提供的广告单元 ID 仅用于测试,由Google 提供。

6、 Editing Java file
Edit admobtest->src->com->walkiway->admob_test->admob_test.java

/****************************************************************************ms modified *******Copyright (c) 2008-2010 Ricardo QuesadaCopyright (c) 2010-2012 cocos2d-x.orgCopyright (c) 2011      Zynga Inc.Copyright (c) 2013-2014 Chukong Technologies Inc.http://www.cocos2d-x.orgPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.****************************************************************************//*Copyright (c) 2014 MudafarGPLv3*/package com.walkiway.admob_test;import org.cocos2dx.lib.Cocos2dxGLSurfaceView;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import org.cocos2dx.lib.Cocos2dxActivity;import android.annotation.TargetApi;import android.graphics.Color;import android.graphics.Point;import android.os.Build;import android.os.Bundle;import android.view.Display;import android.view.View;import android.view.WindowManager;import android.widget.LinearLayout;import com.google.android.gms.ads.AdSize;import com.google.android.gms.ads.AdRequest;import com.google.android.gms.ads.AdView;public class admob_test extends Cocos2dxActivity{    private static admob_test  _appActiviy;    private AdView adView;    private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/6300978111";    // Helper get display screen to avoid deprecated function use    private Point getDisplaySize(Display d)    {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)        {            return getDisplaySizeGE11(d);        }        return getDisplaySizeLT11(d);    }    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)    private Point getDisplaySizeGE11(Display d)    {        Point p = new Point(0, 0);        d.getSize(p);        return p;    }    private Point getDisplaySizeLT11(Display d)    {        try        {            Method getWidth = Display.class.getMethod("getWidth", new Class[] {});            Method getHeight = Display.class.getMethod("getHeight", new Class[] {});            return new Point(((Integer) getWidth.invoke(d, (Object[]) null)).intValue(), ((Integer) getHeight.invoke(d, (Object[]) null)).intValue());        }        catch (NoSuchMethodException e2) // None of these exceptions should ever occur.        {            return new Point(-1, -1);        }        catch (IllegalArgumentException e2)        {            return new Point(-2, -2);        }        catch (IllegalAccessException e2)        {            return new Point(-3, -3);        }        catch (InvocationTargetException e2)        {            return new Point(-4, -4);        }    }    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);        int width = getDisplaySize(getWindowManager().getDefaultDisplay()).x;         LinearLayout.LayoutParams adParams = new LinearLayout.LayoutParams(                  width,                  LinearLayout.LayoutParams.WRAP_CONTENT);            adView = new AdView(this);            adView.setAdSize(AdSize.BANNER);            adView.setAdUnitId(AD_UNIT_ID);            AdRequest adRequest = new AdRequest.Builder()                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)                .addTestDevice("HASH_DEVICE_ID")                .build();            adView.loadAd(adRequest);            adView.setBackgroundColor(Color.BLACK);            adView.setBackgroundColor(0);            addContentView(adView,adParams);            _appActiviy = this;    }     public static void hideAd()    {        _appActiviy.runOnUiThread(new Runnable()         {            @Override             public void run()             {                if (_appActiviy.adView.isEnabled())                    _appActiviy.adView.setEnabled(false);                if (_appActiviy.adView.getVisibility() != 4 )                    _appActiviy.adView.setVisibility(View.INVISIBLE);            }        });    }     public static void showAd()    {        _appActiviy.runOnUiThread(new Runnable()         {            @Override             public void run()             {                               if (!_appActiviy.adView.isEnabled())                    _appActiviy.adView.setEnabled(true);                if (_appActiviy.adView.getVisibility() == 4 )                    _appActiviy.adView.setVisibility(View.VISIBLE);                                         }        });    }     @Override    protected void onResume() {        super.onResume();        if (adView != null) {          adView.resume();        }    }    @Override    protected void onPause() {         if (adView != null) {              adView.pause();        }        super.onPause();    }    @Override    protected void onDestroy() {        adView.destroy();        super.onDestroy();    }        public Cocos2dxGLSurfaceView onCreateView() {        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);        // admob_test should create stencil buffer        glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);        return glSurfaceView;    }    static {        System.loadLibrary("cocos2dcpp");    }   }

Very Important:private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/6300978111";
应用程序正式发布时,此处应根据admob 账号 APP 里的广告ID 进行修改。

7、 Editing CPP file:
Create a new file “AdmobHelper.h” in “admobTest\Classes”

/*Copyright (c) 2014 MudafarGPLv3*/#ifndef  __ADMOB_HELPER_H_#define  __ADMOB_HELPER_H_class AdmobHelper{public:    static void hideAd();    static void showAd();    static bool isAdShowing;};#endif // __ADMOB_HELPER_H_

Create a new file “AdmobHelper.cpp” in “admobTest\Classes”

/*Copyright (c) 2014 MudafarGPLv3*/#include "AdmobHelper.h"#include "cocos2d.h"bool AdmobHelper::isAdShowing = true;#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include "platform/android/jni/JniHelper.h"#include <jni.h>//#include <android/log.h>const char* AppActivityClassName = "com/walkiway/admob_test/admob_test";void AdmobHelper::hideAd(){    cocos2d::JniMethodInfo t;    if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "hideAd", "()V"))    {        t.env->CallStaticVoidMethod(t.classID, t.methodID);        t.env->DeleteLocalRef(t.classID);        isAdShowing = false;    }}void AdmobHelper::showAd(){    cocos2d::JniMethodInfo t;    if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "showAd", "()V"))    {        t.env->CallStaticVoidMethod(t.classID, t.methodID);        t.env->DeleteLocalRef(t.classID);        isAdShowing = true;    }}#elsevoid AdmobHelper::hideAd(){    CCLOG("hideAd() called");    isAdShowing = false;    return; //nothing}void AdmobHelper::showAd(){    CCLOG("showAd() called");    isAdShowing = true;    return; //nothing;}#endif

Very Important: const char* AppActivityClassName = "com/walkiway/admob_test/admob_test";
proj.andorid/src目录下路径,最后的.java后缀不要写。

8、Control Ads visibility:
JNI
Now will show “admobTest” ad :

#include "AdmobHelper.h"
    AdmobHelper::showAd();

9、编辑 .MK file:
Edit admobTest -> jni > Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := cocos2dcpp_sharedLOCAL_MODULE_FILENAME := libcocos2dcppLOCAL_SRC_FILES := hellocpp/main.cpp \                   ../../Classes/AppDelegate.cpp \                   ../../Classes/HelloWorldScene.cpp \                   ../../Classes/AdmobHelper.cppLOCAL_C_INCLUDES := $(LOCAL_PATH)/../../ClassesLOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_staticLOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_staticLOCAL_WHOLE_STATIC_LIBRARIES += box2d_staticLOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_staticLOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_staticinclude $(BUILD_SHARED_LIBRARY)$(call import-module,cocos2dx)$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)$(call import-module,CocosDenshion/android)$(call import-module,extensions)$(call import-module,external/Box2D)$(call import-module,external/chipmunk)

最后:
Note:
终端:
build-native.sh
Eclipse:
Run -> Run as Android Application -> Wait ads to show

0 0
原创粉丝点击