追記:2013/10/11
HSPでadmobが正式に実装されました。今後はそちらを使うのが良いでしょう。
一応技術メモとして当記事を残しておきます。
*****
hsp3.4β1からiOSにおいてiAdが使用可能になった。しかしAndroidにおけるadmobの表示はまだ未実装だ。
噛み砕いて考えればhsp3dishのアプリだってAndroid SDKを利用して動いているのだ。ソースを自力でいじればなんとか実装出来るんじゃないかと思って、試行錯誤することにした。
hsp3dishはAndroid NDKを利用して動作するのだが、簡潔に言うとNDKってやつは全画面の描画しか出来ない。
ActivityGroupを使ってNDKのactivityと広告表示activityを並べて表示させればいいじゃんと思ったが、浅はかな考えだった。
で、色々調べて
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-----------------------------------------------------------------------
}
うまくいけば下の方にadmobが表示されると思う。とりあえずクリックでブラウザを開く所まで確認できた。
まだ検証すべき部分は多々あると思うが、とりあえずできたことだけ報告しておく。


なんかブログがいつのまにかできてたようなので記念マキコ(・x・)
ツイッターでつぶやくと鬱陶しいような話をしていきたいです。