hyoromoのブログ

iOS/AndroidもしくはCocos2dxネタを書いています

Cocos2d-x v3.4 でのAdMob表示方法

f:id:hyoromo:20150305112155j:plain
Cocos2dx v3.4 でPlugin-xを使ったAdMob表示方法を書きます。

環境

iOS対応

Xcode上で以下のようにします。

  1. Plugin-x内のAdMob SDKを最新のv7に更新します。更新方法に関してはこちらを参照して行ってください
  2. Xcodeから「cocos2d/plugin/protocols」と「cocos2d/plugin/plugins/admob」をファイル追加します
  3. 先ほど追加したファイルの中でAndroid側のコードをXcode上から削除します。主に proj.android と書かれてあるフォルダが対象となります
  4. iOSIAPAgentでビルドエラーが発生する為、iOSの課金処理をPlugin-xで行わないのであれば以下の事を行います
    ・cocos2d/plugin/protocols/include/iOSIAPAgent.h で凡ミス箇所の修正
    ・cocos2d/plugin/protocols/platform/ios/iOSIAPAgent.mm ファイル削除
  5. 以下のframeworkを追加します
    ・StoreKit.framework
    ・EventKit.framework
    ・EventKitUI.framework
    ・SystemConfiguration.framework
    ・AdSupport.framework
    ・MessageUI.framework
    ・CoreTelephony.framework

Android対応

Eclipse上で以下のようにします。

  1. android-sdk/extras/google/google_play_services/libproject/google-play-services_lib」Workspaceをimportします
  2. 「cocos2d/plugin/protocols」と「cocos2d/plugin/plugins/admob」Workspaceをimportします
  3. google-play-services_lib、protocols、admob の順にプロジェクトをクリーンビルドします
  4. admobプロジェクトのPropertiesから、Android > Library へ google-play-services_lib を追加します
  5. admobプロジェクトをGoogle Play Services対応させます。admobプロジェクトのPropertiesをから、Java Build Path > Libraryes リストにある GoogleAdMobAdsSDK.jar を削除します。後はエラー発生箇所を地道に修正していってください。その際に以前書いたこのエントリーが役立つかと思います
  6. AdMob掲載対象プロジェクトのPropertiesから、Android > Library へ admob を追加します
  7. ここから各種ファイルのコード修正となります。AdMob掲載対象プロジェクト上で実行ください
AndroidManifest.xml
(略)
    <application android:label="@string/app_name"
                 android:icon="@drawable/icon">
    (中略)
        <!-- Google Play Serviceを追加 -->
        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <!-- AdMobを追加 -->
        <activity android:name="com.google.android.gms.ads.AdActivity"
             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    </application>

    <supports-screens android:anyDensity="true"
                      android:smallScreens="true"
                      android:normalScreens="true"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>

    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- 追加 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
jni/Android.mk
()
LOCAL_STATIC_LIBRARIES := cocos2dx_static
LOCAL_STATIC_LIBRARIES += PluginProtocolStatic    // ここに追加

include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
$(call import-module,plugin/protocols/proj.android/jni)    // ここに追加
jni/hellocpp/main.cpp
void cocos_android_app_init (JNIEnv* env, jobject thiz) {
    LOGD("cocos_android_app_init");
    AppDelegate *pAppDelegate = new AppDelegate();

    // 以下の3行を追加
    JavaVM* vm;
    env->GetJavaVM(&vm);
    PluginJniHelper::setJavaVM(vm);
}
src/org.cocos2dx.cpp/AppActivity.java
public class AppActivity extends Cocos2dxActivity {
    public Cocos2dxGLSurfaceView onCreateView() {
        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
        glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);

        PluginWrapper.init(this);
        PluginWrapper.setGLSurfaceView(glSurfaceView);
        return glSurfaceView;
    }
}
ビルド

ここまで変更した後、./build_native.py でビルドし、プロジェクト自体をクリーンビルドすれば終わりです。

共通コード

Cocos2d-x側で書けるiOS/Android共通コードです。

// .h
typedef enum {
    kTypeBanner = 1,
    kTypeFullScreen,
} AdmobType;

typedef enum {
    kSizeBanner = 1,
    kSizeIABMRect,
    kSizeIABBanner,
    kSizeIABLeaderboard,
    kSizeSkyscraper,
    kSizeLargeBanner,
} AdmobSizeEnum;

class Hoge {
private:
    ProtocolAds *_admob;
    TAdsInfo _adInfo;
    ProtocolAds::AdsPos _adPos;

    void showBanner();
    void hiddenBanner();
// .cpp
void Hoge::showBanner() {
    if (!_admob) {
        _admob = dynamic_cast<ProtocolAds*>(PluginManager::getInstance()->loadPlugin("AdsAdmob"));
        TAdsDeveloperInfo devInfo;
#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
        devInfo["AdmobID"] = "iOSの広告ユニットID";
#elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
        devInfo["AdmobID"] = "Androidの広告ユニットID";
#endif
        _admob->configDeveloperInfo(devInfo);
        _adPos = ProtocolAds::kPosBottom;
        _adInfo["AdmobType"] = StringUtils::format("%d", kTypeBanner);
        _adInfo["AdmobSizeEnum"] = StringUtils::format("%d", kSizeBanner);
    }
    _admob->showAds(_adInfo, _adPos);
}

void Hoge::hiddenBanner() {
    if (_admob) {
        _admob->hideAds(_adInfo);
    }
}

AdmobType と AdmobSizeEnum は AdsAdmob.h で定義してあるものです。本当はそちらを直接参照したいのですが...
AdmobSizeEnumへの設定値はAdMobドキュメントを参照すると分かりやすいです。kSizeBanner以外は未定義だったと思いますので、他種類を増やしたい場合はiOS/Androidそれぞれのコード修正が必要になります。

他アドネットワークサービスの追加

nend/i-mobileがそれぞれCocos2dx向けにライブラリを出しているのでそちらを利用します。DL方法や実装方法は省き、いつも追加するのが煩わしいiOSの必要frameworkだけ書きます。なお、AdMob導入時のframeworkは追加済みを想定しています。

nend
  • ImageIO.framework
i-mobile
  • CoreLocation.framework

あとi-mobileはv3.3でCocos2dx内部パッケージが大きく変わった対応が反映されていない為、IMobileCocos2dxModule.mm を以下のように修正する必要があります。

// before
#import "CCEAGLView.h"

// after
#import "CCEAGLView-ios.h"