バージョンrc0から、cocos2d-xはNativeActivityではなくなったそうなので、この記事のテクニックは必要なくなったかもしれません。
ただ、NativeActivity上でJavaパーツを扱うというテクニック自体は、今後も役に立つことはあるのではないかと思います。
こんにちは。OBAKESAN.netの管理人もっさんです。
Cocos2d-Xは、3.0になってから、AndroidのActivityが
NativeActivityというものになりました。
この
NativeActivityですが、VMを利用せずにCやC++で直接プログラムがかけるため、高速という利点があるそうです。
・・・反面!そのまま通常のActivityのようにJava View関連を書いても表示されなくなりました。
※ためしに、
Cocos2d-x(Android)の[
NativeActivity[を、そのまま[Activity]に書き直してみるとわかりやすいと思います。
そこで困るのが、いわゆるAndroid版の
広告AD。
これらは通常Activity用に書かれているため、そのままでは表示できません。たぶん。できたらごめんなさい。
そのため、今回は
NativeActivityの上で
広告AD(Activity用パーツ)を表示し、使えるようにしていこうと思います。
※なお、今回の記事は、DynaDreamさんの
「Showing AdMob’s ads using native activity with Android’s NDK」という記事を基本的に参考にして作りました。誠にありがとうございました。
上記の記事ではAdMobを基準にかかれていますが、今回は
AdStirを対象に記載いたします。基本部分は同じですので、他のAdにもそのまま書き換えて使えると思います。
ちなみに表示例はこんな感じです。
下に広告が表示されています。もちろんちゃんとタッチすれば反応して広告ページに飛べます。
なお、アプリは現在開発中のものです。そろそろ出せるのではないかと。私の初
Cocos2d-x、初Android対応アプリとなる予定です。
まず前提条件として、
・[1]:
AdStir(メデュエーション)の登録、および設定が終わっている
・[2]:
AdStirの必要ファイルをEclipseに組み込み終わっている
・[3]:JNIから、広告表示したい際に[adViewOn()]、非表示の際に[adViewOff()] のメソッドを呼ぶ用になっている
という前提で記載致します。
「そこも大事だろうーーーー!!!!」という声が聞こえてくる気がします。すいません;
今回そこまで書くと記事が大きくなってしまうので、大変面目ないですが割愛します。この記事に追加という形などで書けたらいいなあと思います;
で。
標準ですと、Androidの、src/org.cocos2dx.cpp/Cocos2dxActivity.java の中に、
public class Cocos2dxActivity extends NativeActivity{
というような感じで記載されていると思います。
普通のJavaプロジェクトはActivityを継承していますが、ここでは
NativeActivityが継承されているのがわかると思います。
※ちなみに、試しにこの行の
NativeActivityをActivityに書き直すと、Javaのビューも表示されます。そのかわり
Cocos2d-xの画面が表示されませんが;
それでは、ソースコードを書き換えていきましょう。そのままJNIで呼び出すと静的メソッド(Static)が呼び出されると思いますため、 ここでは静的メソッドと静的メンバ変数を使っていこうと思います。
このソースはとりあえずのため、今後改良するかもしれませんので、そこは悪しからずです。
以下は
AdStirを前提に書いていますが、AdMobなど他の
広告ADでも基本は変わらないと思います。
それではいきましょー。
あ、なお消してからまた再表示などはまだテストしていないので、多分また内容は変わります;とりあえずver1.0ということでおながいします・・・
※referring SourceCode URL:
http://www.dynadream.com/ddweb/index.php/Special_Blog?id=20
package org.cocos2dx.cpp;
import android.app.NativeActivity;
import android.os.Bundle;
import com.ad_stir.AdstirTerminate;
import com.ad_stir.AdstirView;
import android.view.Gravity;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
public class Cocos2dxActivity extends NativeActivity{
public static Cocos2dxActivity myActivity;
static final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;
static final int MC = LinearLayout.LayoutParams.MATCH_PARENT;
public static LinearLayout linearLayout;
public static AdstirView adstirView = null;
public static PopupWindow popUpWindow;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
System.out.println("アクティビティ開始。");
super.onCreate(savedInstanceState);
_myActivity = this;
linearLayout = new LinearLayout(this);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
addContentView(linearLayout,new LinearLayout.LayoutParams(MC, MC));
}
public static void adViewOn()
{
_myActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
System.out.println("adViewOn()が実行されました。広告を表示します。");
popUpWindow = new PopupWindow(_myActivity);
//広告サイズを変えたい場合は、以下を変更します。
popUpWindow.setWidth(320);
popUpWindow.setHeight(50);
popUpWindow.setWindowLayoutMode(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
popUpWindow.setClippingEnabled(false);
LinearLayout layout = new LinearLayout(_myActivity);
//以下に、あなたのAdStirのメディアIDと枠Noを指定してください。
adstirView = new AdstirView(this, "あなたのメディアID", あなたの枠No);
layout.addView(adstirView, new LinearLayout.LayoutParams(WC, WC));
popUpWindow.setContentView(layout);
popUpWindow.showAtLocation(linearLayout, Gravity.BOTTOM, 0, 0);
popUpWindow.update();
}
});
}//:adViewOn
public static void adViewOff()
{
System.out.println("adViewOff()が実行されました。広告を消去します。");
popUpWindow.dismiss();
}//adViewOn
@Override
protected void onDestroy() {
System.out.println("onDestroyが実行されました。");
AdstirTerminate.init(this);
super.onDestroy();
}
}
といったような感じです。
今後も改良していきたいところですが、とりあえずということで。
元のAdMob用プログラムを作成した
DynaDreamさんには、誠感謝でござんす。