Adlantisでcocos2d-x向けのSDKが出てたので使ってみた

Pocket

adlantis_cocos2dx

なんか毎回広告のはAdlantisのネタばかり書いちゃってて、もしかしたらアプリではそれ使ってるんじゃないかって勘ぐられてしまうのではないかとハラハラしたりしなかったりですが2014年6月18日で公開されてたのを知って早速導入してみたんで、そのメモを残しておきます。

実装してみた印象としては、大変さはあまり変わらないかもです(´・ω・`)
やはりAndroidの最初の設定がかなり鬼門ですね。

ただ以前は処理毎にjniとobjective-c別々のメソッドを作らないといけなかったのがcocos2d-x内で全て処理できるようになるので、それはかなり大きいですね。
結果的に見るとSDKを導入した方がいいんじゃないかと思います。

まずはダウンロード

何でもそうですけど、まずはダウンロードしないと始まらないですよね。
※2014/7/1現在、cocos2d-xの2.2用と3.0(3.1)用が公開されています。

Adlantis SDK For Cocos2d-x
http://tn.adlantis.jp/adnw/sp/media/adlantis_cocos2dx_sdk

もちろんですが、既にAdlantisに登録して広告枠を作成してないと使用はできません。

さて、ZIPファイルを落としたらその展開したファイルの中にREADME_ja.pdfというファイルがあり、そこに実装方法が書かれています。それでもうサクっと実装できますね。

ただ自分のまとめもかねてるんで、ブログは続けます。

プロジェクトの中に導入する

手順は以下の通りとなります。

  1. 事前準備
  2. (iOS)プロジェクトを追加する
  3. (iOS)ターゲット他もろもろを追加する
  4. (Android)toolsのconfig.shファイルをいじり、スクリプト実行
  5. (Android)Plugin-xの初期化とJava VMの設定

それではいってみましょう。

事前準備

まず最初に、解凍した中に入っている「adlantis」ディレクトリを(cocos2dx)/plugin/plugins/下に放り込みます。

※(cocos2dx)はcocos2d-xのルートディレクトリです。

adlantsSDK_1

次に、このSDKを使えるようにする為にはgawkコマンドが必要のようなので、それをインストールしておきます。
(入ってる人はこの作業はいりません。ターミナルまたはコマンドプロンプトで、「gawk -version」と入力してちゃんと返ってきたら入ってます)

gawkのインストールに関しては今回詳しくは書きません。
それが書かれてあるサイトのリンクだけ張っておきます。

【Macの手順】
Mac Portsをインストール
その後gawkをインストールする
【Windowsの手順】
Vectorに落ちてます。多分これを適当な場所に置いてパスを通せば使えるかと。
※ただここの記事によるとWindows版では完璧なのは今はないみたい。。

iOS側の設定(Adlantisのプロジェクトを追加する)

準備ができたら、次はiOS側の設定です。
自信のプロジェクトの中に、以下の2つのプロジェクトを追加します。

・(cocos2dx)/plugin/protocols/proj.ios/PluginProtocol.xcodeproj
・(cocos2dx)/plugin/plugins/adlantis/proj.ios/PluginAdlantis.xcodeproj

androidSDK_2

androidSDK_3

次に、以下の6つのファイル及びライブラリを「Build Phases」->「Link Binary With Libraries」に追加します。

・libPluginProtocol.a
・libPluginAdlantis.a
・CoreTelephony.framework
・SystemConfiguration.framework
・QuartzCore.framework
・AdSupport.framework

androidSDK_4

6個目のAdSupport.frameworkはREADME_ja.pdfには載ってませんが、入れないとビルド時Xcodeさんにガチギレされます(´・ω・`)
※訂正:2014年7月3日現在、README_ja.pdfにも反映されています。

最後に、Build SettingsHeader Search PathsOther Linker Flagsにそれぞれ設定を反映させたら完了です。

【Header Search Paths】
$(SRCROOT)/../../../plugin/protocols/includeを追加

androidSDK_5

【Other Linker Flags】
-force_load $(BUILT_PRODUCTS_DIR)/libPluginAdlantis.aを追加

androidSDK_6

-force_load~のは1行で追加しようとしても2行に別れちゃうんだけど、別に気にしなくてOK。

Android側の設定をする

次はAndroid側の設定です。ちょい面倒ですが、色々失敗しても最終的にパス関連をちゃんと通せば使えるようになります(と思います)
(cocos2dx)/plugin/tools/config.shを開き、ALL_PLUGINSに「adlants」を追加します。

#define plugins array
export ALL_PLUGINS=("flurry" "umeng" \
"alipay" "nd91" \
"admob" \
"twitter" "weibo" "adlantis")

設定したら、ターミナル(コマンドプロンプト)から「publish.sh」を実行します。

$ ./publish.sh

すると、AndroidNDKやAndroidSDK、antのパスを聞かれます。
それぞれちょっと調べてからやった方がいいかも。

うまくいったら(cocos2dx)/plugin/publish/plugins内にadlantisが入るっぽい。

androidSDK_7

次に、(cocos2dx)/plugin/tools/gameDevGuide.shを実行します。
※README_ja.pdfでは「失敗するかも」と書いてます(´・ω・`)その対処法はそっちに詳しく書いてますが、ぼくの場合ちゃんとできたのでそのまま進めます。
成功すると、こんなウィンドウが現れてちょっとおろおろします。

androidSDK_8

でもただ単にプロジェクトのパスを入れたらいいだけです。Eclipseからプロジェクトのプロパティを開き、ロケーションをコピーしてペーストしましょう。

androidSDK_9

atlantisを選択します。

androidSDK_10

うまくいきました。

ただ、README_ja.pdfでは「プロジェクトの中にplugin-xのリンクができる」と言われたけどでなぜか出ませんでした。。(´・ω・`)
更に、jniディレクトリのAndroid.mkに書き足されるのですが、そこの記載が違ってたりします。
(ぼくのディレクトリの置き方が違うのかな?)

仕方ないので、ここからは手動で設定していきます。
ここまでできたら、もうあとはパスとリンク関連だけなので、怖がることはありません(暫くビルド失敗が続いて心折れかけたけど)。

パスとリンクの設定

とりあえず、以下の箇所のソースをリンクする必要があります。

(cocos2dx)/plugin/protocols/proj.android/src/
(cocos2dx)/plugin/plugins/adlantis/proj.android/src

プロジェクトの「プロパティ」->「Javaのビルドパス」->「ソース」を表示し、ソースのリンクを追加します。

androidSDK_11

続いて、「ライブラリー」を見ると、adlantis.jarがリンク切れのような感じになってました。(cocos2dx)/plugin/publish/plugins/adlantis/android内にjarファイルがあるので、そっちに置き換えます。

順序及びエクスポート」を見ると、adlantis.jarファイルのチェックボックスが外れてたので、チェックを入れます。

これで、とりあえずのパスとリンクの設定は大丈夫かと思います。

でもまだ終わらない

jni/Android.mkを見ると、ちょっと書き換えられてるのがわかります。
しかし$(call import-module,plugin/protocols)みたいなののパスが違っていて、エラーがおきます。
これは(cocos2dx)/plugin/protocols/proj.android/jni内にあるAndroid.mkのパスを指定してあげたらいいので、そう書き換えます。

//LOCAL_WHOLE_・・・の所に足されてるのを確認
LOCAL_WHOLE_STATIC_LIBRARIES += libPluginProtocolStatic
//$(call import-module,plugin/protocols)がダメな場合以下に修正
$(call import-module,plugin/protocols/proj.android/jni)

次に、Cocos2dxActivityを継承したActivityと、jni/heloocpp/main.cppを編集します。
cocos2d-xでプロジェクトを作成した際に自動で作られるやつですね。

public Cocos2dxGLSurfaceView onCreateView() {
    Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
    glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
    /* ここから下を付け足す */
    PluginWrapper.init(this);
    PluginWrapper.setGLSurfaceView(glSurfaceView);
    /* ここまで */
    return glSurfaceView;
}

次に、main.cppも編集です。

//以下をインクルード
#include "PluginJniHelper.h"

jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
    JniHelper::setJavaVM(vm);
    //以下の一行を追加
    PluginJniHelper::setJavaVM(vm);
    return JNI_VERSION_1_4;
}

これで、設定完了です。

使ってみる

使い方はREADME_ja.pdfに書いてますが、AppDelegateクラス内に実装したらSceneの遷移に関わらず表示されるっぽいので、そこに実装します。
(もちろんScene内に実装もできます。詳しい使い方はZIPファイル内にあるサンプルソースを見るほうがいいかも)

まずは、メンバ変数で「cocos2d::plugin::ProtocolAds* mAdlantisAdsBanner」みたいな感じで持たせてます。

#include "ProtocolAds.h"
#include "PluginManager.h"
bool AppDelegate::applicationDidFinishLaunching() {
/* (..省略..) */
   mAdlantisAdsBanner = dynamic_cast<ProtocolAds*>(PluginManager::getInstance()->loadPlugin("AdsAdlantisBanner"));
   //バナー用のpublisherIDを設定する
   TAdsDeveloperInfo devInfo;
   devInfo["AdlantisPublisherID"] = "パブリッシャーID";
   mAdlantisAdsBanner->configDeveloperInfo(devInfo);
   //バナー表示する場所を指定
   ProtocolAds::AdsPos pos = ProtocolAds::kPosBottom;
   //バナーを表示
   mAdlantisAdsBanner->showAds(ProtocolAds::kBannerAd, 0 , pos);
}

実行してみます。

androidSDK_12

うまく表示されています。

最初にも書きましたが、以前はjniを使ったりと色々面倒でしたけど、バナーの表示/非表示といった操作をcocos2d-x内でできるのはかなり大きいですね。

補足:インタースティシャル広告の設置方法(2014/08/05)

まあ、DLすると入ってるadlantisSampleのコードそのままなんですが。
自分用のメモもかねて載せておきます。

まず、クラス内で以下のようにメンバ変数を持たせます。

  cocos2d::plugin::ProtocolAds* mAdlantisAdsInterstitial;

次に、実装です。

  mAdlantisAdsInterstitial = dynamic_cast<ProtocolAds*>(PluginManager::getInstance()->loadPlugin("AdsAdlantisInterstitial"));
  TAdsDeveloperInfo devInfo;
  devInfo["AdlantisPublisherID"] = "パブリッシャーID";
  mAdlantisAdsInterstitial->configDeveloperInfo(devInfo);
  

  //表示する時
  mAdlantisAdsInterstitial->showAds(ProtocolAds::kFullScreenAd , ProtocolAds::kPosCenter);
  
  //非表示にする
  mAdlantisAdsInterstitial->hideAds(ProtocolAds::kFullScreenAd);

これも、AppDelegateなんかに持たせておくといいかもですね。

補足2:プラグインのリリース方法

これもサンプルに書いてるんですけど、いつも忘れちゃうので(´・ω・`)
以下のようにかくと、内部的に作成したインスタンスを破棄してくれるみたいです。

PluginManager::getInstance()->unloadPlugin("AdsAdlantisBanner");

この中身を”AdsAdlantisInterstitial”にしたら、インタースティシャルのも破棄されるっぽい。

Adlantisでcocos2d-x向けのSDKが出てたので使ってみた” への4件のコメント

  1. Glossom株式会社AdLantisチームです。

    弊社SDKにつきまして、ブログでの導入方法のご紹介、誠にありがとうございます!

    AdSupport.frameworkにつきまして、ご指摘のとおり説明が不足しておりましたので、
    READMEに追記させて頂きました。

    ご指摘頂きまして、ありがとうございます。

    今後も説明資料などで不足している点などがありましたら、改善していきたいと思っております。
    引き続き何卒宜しくお願い致します。

    • こちらこそcocos2d-xのSDKを公開して頂いてありがとうございます、つたない記事ですみません(>_<) 素早い対応ですね、さすがです(^-^; やっぱり便利だし、今後も使わせて貰えたらと思うのでよろしくお願いしますm(__)m

      • 本文への早速のご反映ありがとうございます!
        このようにご紹介頂くことは、とても嬉しいです。
        今後もご紹介頂くことがございましたら、遠慮なさらずに厳しいご意見頂ければと思います。

        • ありがとうございます、今回SDK導入してバナーを表示しただけなので、今後色々機能を使わせてもらいます(^-^)/

Glossom株式会社AdLantisチーム にコメントする コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です