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に

1
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」を参照してほしい。書き込む場所は

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
public class HspActivity extends NativeActivity {
 
//ここからadmob用コード----------------------------
 AdView adView;
 PopupWindow popUp;
:
:
 
:
:
adView.destroy();
      }
      super.onDestroy();
  }
//ここまでadmob用コード----------------------------
 
  public String hello() {
    return "JNITest";
  }

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

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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が表示されると思う。とりあえずクリックでブラウザを開く所まで確認できた。

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

HSP3Dishアプリにadmobを貼り付ける」への2件のフィードバック

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

へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。


*