HSP3Dishアプリにadmobを貼り付ける

Pocket

追記:2013/10/11
HSPでadmobが正式に実装されました。今後はそちらを使うのが良いでしょう。
一応技術メモとして当記事を残しておきます。
*****

hsp3.4β1からiOSにおいてiAdが使用可能になった。しかしAndroidにおけるadmobの表示はまだ未実装だ。
噛み砕いて考えればhsp3dishのアプリだってAndroid SDKを利用して動いているのだ。ソースを自力でいじればなんとか実装出来るんじゃないかと思って、試行錯誤することにした。

hsp3dishはAndroid NDKを利用して動作するのだが、簡潔に言うとNDKってやつは全画面の描画しか出来ない。
ActivityGroupを使ってNDKのactivityと広告表示activityを並べて表示させればいいじゃんと思ったが、浅はかな考えだった。

ndkadmob

で、色々調べて
Showing AdMob’s ads using native activity with Android’s NDK
という記事にたどり着いた。彼の公開しているゲームを遊んでみたが、確かに下の方にadmobが表示されている。
どうやらC/C++側からJAVAのアクティビティをコールすることで実現可能とのこと。さっそく公開されているコードをHSP3Dishサンプルコードに組み込んでみた。

1.
前提としてソースのコンパイルはHSP3Dish Helperを使用せず、eclipseを使って行う。
詳しい設定方法は「HSP3Dish android(NDK)版 eclipse設定ガイド」が参考になると思う。

2.
Google AdMob Ads Android(初級)を参考にしてadmob SDKのJARを追加する。
一度hspproj\src\tv\hsp\HspActivity.javaのimportに

import com.google.ads.*;

を加え、動作するかどうか確認。
(なんかココらへん微妙だったんだが、jarファイルはlibディレクトリにコピーしてから「外部アーカイブの追加」をしたほうがその後エラー無く進んだきがする。)

3.
eclipseからアプリの動作を確認できたら、「hspproj\src\tv\hsp\HspActivity.java」にC/C++からコールされる側のサブクラスを用意する。
詳しいコードは「Showing AdMob’s ads using native activity with Android’s NDK」を参照してほしい。書き込む場所は

public class HspActivity extends NativeActivity {

//ここからadmob用コード----------------------------
 AdView adView;
 PopupWindow popUp;
:
:

:
:
adView.destroy();
	  }
	  super.onDestroy();
  }
//ここまでadmob用コード----------------------------

  public String hello() {
    return "JNITest";
  }

この辺。
エラーが出るけど、eclipseが修正候補を示してくれるので、それにしたがって修正。ほとんどimportだけで済むと思う。

adView = new AdView(_activity, AdSize.BANNER, "changethiswithyouradmobid");

の「changethiswithyouradmobid」の部分はadmobのIDを入力する。
とりあえず動かしてみて、エラーがないかを確認。

4.
jni/main.cppを編集する。
念のため少しウェイトを持たせて実行するようにしているが、ひょっとしたら不要かもしれない。
まず android_main内でadscounter変数を宣言

void android_main(struct android_app* state) {
    struct engine engine;
	int adscounter = 0; //admobをcallするタイミング調整用(いらないかもしんない。)

その後、if (engine.animating)条件内でcounterを回してやり、100ループくらいしたらadmobをコールする。

        if (engine.animating) {
            // 画面描画
			hsp3eb_exectime( hgio_gettick() );
			//hsp3eb_exec();
			//engine_draw_frame(&engine);

			//call admob-----------------------------------------------------------------------
			if(adscounter < 100){  				adscounter++;  				LOGI("%d", adscounter);  				if(adscounter == 100){  					LOGI("[GetADS]");  					ANativeActivity* activity = state->activity;
					JavaVM* jvm = state->activity->vm;
					JNIEnv* env = NULL;
					(*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_6);
					jint res = (*jvm)->AttachCurrentThread(jvm, &env, NULL);
				    if (res != JNI_ERR){
					    jclass clazz = (*env)->GetObjectClass(env, activity->clazz);
					    jmethodID methodID = (*env)->GetMethodID(env, clazz, "showAdPopup", "()V");
					    (*env)->CallVoidMethod(env, activity->clazz, methodID);
					    (*jvm)->DetachCurrentThread(jvm);
				    }
				}
			}
			//call admob-----------------------------------------------------------------------

        }

device-2013-05-08-194013

うまくいけば下の方にadmobが表示されると思う。とりあえずクリックでブラウザを開く所まで確認できた。

まだ検証すべき部分は多々あると思うが、とりあえずできたことだけ報告しておく。

2 comments

  1. 埼玉のボンクラちゃん より:

    なんかブログがいつのまにかできてたようなので記念マキコ(・x・)

    • 俺 より:

      ツイッターでつぶやくと鬱陶しいような話をしていきたいです。

コメントを残す

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


*