読者です 読者をやめる 読者になる 読者になる

cocos2d-x(Android)にAdMobインタースティシャル広告を表示する

Android

SDK Managerより、「Android Support Registory」、「Google Play Services」、「Google Repository」をインストールしておく。

build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "xxxx.hoge.co.jp"
        minSdkVersion 10
        targetSdkVersion 22
        versionCode 2
        versionName "1.01"
    }

    sourceSets.main {
        java.srcDir "src"
        res.srcDir "res"
        jniLibs.srcDir "libs"
        manifest.srcFile "AndroidManifest.xml"
        assets.srcDir "assets"
    }

    signingConfigs {

       release {
            if (project.hasProperty("RELEASE_STORE_FILE")) {
                storeFile file(RELEASE_STORE_FILE)
                storePassword RELEASE_STORE_PASSWORD
                keyAlias RELEASE_KEY_ALIAS
                keyPassword RELEASE_KEY_PASSWORD
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            if (project.hasProperty("RELEASE_STORE_FILE")) {
                signingConfig signingConfigs.release
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':libcocos2dx')
    compile 'com.google.android.gms:play-services-ads:+'
}

task cleanAssets(type: Delete) {
    delete 'assets'
}
task copyAssets(type: Copy) {
    from '../../Resources'
    into 'assets'
}

clean.dependsOn cleanAssets
preBuild.dependsOn copyAssets

compile 'com.google.android.gms:play-services-ads:+'を追加。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="s_takahashi.java_conf.gr.jp"
    android:installLocation="auto">

    <uses-feature android:glEsVersion="0x00020000" />
    
    <application
        android:label="@string/app_name"
        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="MyGame" />

        <activity
            android:name="org.cocos2dx.cpp.AppActivity"
            android:screenOrientation="landscape"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            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>

        <!-- ここから追加 -->
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
        <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>

    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- ここから追加 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!-- 追加ここまで -->

</manifest>

コメントの箇所を追加。

AppActivity.java
package org.cocos2dx.cpp;

import android.content.Context;
import org.cocos2dx.lib.Cocos2dxActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;

public class AppActivity extends Cocos2dxActivity {

    private static InterstitialAd interstitialAd;
    private static Context context = null;

    private static native void resumeNext();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        interstitialAd = new InterstitialAd(this);
        interstitialAd.setAdUnitId("ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx");
        requestNewInterstitial();
        final Cocos2dxActivity activity = (Cocos2dxActivity) context;
        activity.runOnUiThread(new Runnable() {
            public void run() {
                interstitialAd.setAdListener(new AdListener() {
                    @Override
                    public void onAdClosed() {
                        requestNewInterstitial();
                        resumeNext();
                    }
                });
            }
        });
    }

    private static void requestNewInterstitial() {
        AdRequest interRequest = new AdRequest.Builder().build();
        interstitialAd.loadAd(interRequest);
    }

    public static void launchInterstitial() {
        final Cocos2dxActivity activity = (Cocos2dxActivity) context;
        activity.runOnUiThread(new Runnable() {
            public void run() {
                if (interstitialAd.isLoaded()) {
                    interstitialAd.show();
                } else {
                    requestNewInterstitial();
                    resumeNext();
                }
            }
        });
    }
}
NativeCodeLauncher.h
#ifndef SEVENS_NATIVECODELAUNCHER_H
#define SEVENS_NATIVECODELAUNCHER_H

#include <jni.h>
#include "cocos2d.h"
#include <unistd.h>
#ifndef _Included_org_cocos2dx_cpp_AppActivity
#define _Included_org_cocos2dx_cpp_AppActivity

class NativeCodeLauncher {
public:
  static void launchInterstitial();
};

extern "C" {

JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_resumeNext();

}

#endif

#endif //SEVENS_NATIVECODELAUNCHER_H
NativeCodeLauncher.cpp
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#include "NativeCodeLauncher.h"
//#include "GameScene.h"

#define CLASS_NAME "org/cocos2dx/cpp/AppActivity"

void NativeCodeLauncher::launchInterstitial() {
    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, CLASS_NAME, "launchInterstitial", "()V")) {
        t.env->CallStaticVoidMethod(t.classID, t.methodID);
        t.env->DeleteLocalRef(t.classID);
    }
}

void Java_org_cocos2dx_cpp_AppActivity_resumeNext()
{
//    Scene* scene { GameScene::createScene() };
//    Director::getInstance()->replaceScene(scene);
}

都度ロードでは遅すぎるのでアプリ起動時にあらかじめ広告をロードしておく。
呼び出し側(ここではGameSceneクラス)からNativeCodeLauncher::launchInterstitial()を実行するとロードされた広告が表示される。
ロードしてから十分な時間を取っておくこと。上記のソースはロードされていない場合の処理を考慮していないがそもそも起動時に表示するのは規約違反
ユーザーが広告を閉じるとonAdClosed()がコールされるので次回の表示に備えて再び広告をロードした後、次の処理(ここではresumeNext)を呼び出す。
resumeNextではcocosの次の画面に遷移している。

AppActivity.javaはもともとapp\src\org\cocos2dx\cpp\AppActivity.javaにある。onCreateは起動時に実行されるメソッド。
NativeCodeLauncher.hとNativeCodeLauncher.cppはcocos2d-xとjavaの橋渡しをするためにapp/jni配下に新規に作成したクラス。