追記: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・)
ツイッターでつぶやくと鬱陶しいような話をしていきたいです。