LoginSignup
6
6

More than 5 years have passed since last update.

cocos2dx-3.0でLua。AdMobを入れてみる(Android編)

Last updated at Posted at 2014-03-19

少し困ったのでメモ

こちらを超参考にしました

環境

cocos2d-x3.0rc0
GooglePlayService
等をインストールしておく。

java

今回は Activityを改造するので
PROJ_DIR/frameworks/runtime-src/proj.Android
以下をさわります。
ここはEclipseのプロジェクトルートなので Eclipse等で読み込んでも良いでしょう

デフォルトでは org.cocos2dx.lua.Cocos2dsActivity.java
が、LAUNCH時に起動するようになってます
このソースを書き換えてもよいのですが、今回は継承してみます

たとえば com.murasamelabo.mimico.MainActivity を作ります

com.murasamelabo.mimico.MainActivity
package com.murasamelabo.mimico;

import org.cocos2dx.lua.Cocos2dxActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.WindowManager;
import com.google.android.gms.ads.*;


public class MainActivity extends Cocos2dxActivity {

   private WindowManager    mWindowManager = null;
   private AdView           mAdView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try{
            // adView を作成する
            mAdView = new AdView(this);
            mAdView.setAdUnitId( APP_ID );
            mAdView.setAdSize(AdSize.BANNER); 

            //広告をリクエスト
            // 本番
            AdRequest adRequest = new AdRequest.Builder().build();
            // test用
            /*    
            AdRequest adRequest = new AdRequest.Builder()
            .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)       // エミュレータ
            .addTestDevice( DEVICE ) // 
            .build();
            //*/
            mAdView.loadAd(adRequest);

            // 重ね合わせするViewの設定を行う
            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();  
            layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER;
            layoutParams.x       = 0; // 表示位置 x  
            layoutParams.y       = 0; // 表示位置 y  
            layoutParams.width   = WindowManager.LayoutParams.WRAP_CONTENT;
            layoutParams.height  = WindowManager.LayoutParams.WRAP_CONTENT;
            layoutParams.type    = WindowManager.LayoutParams.TYPE_TOAST;  // ゲーム画面より前面に表示
            layoutParams.flags   = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;  // 自分以外のところがタッチされたとき、背後のビューにタッチイベントを渡す。

            // WindowManagerを取得する
            mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
            // WindowManagerにAdMobのビューを追加する。
            mWindowManager.addView(mAdView, layoutParams);  
        }catch( Exception e ){

        }
    }   


    @Override
    public void onDestroy() {

        if( mWindowManager != null) 
            mWindowManager.removeView(mAdView);

        if( mAdView != null)    
            mAdView.destroy();

        super.onDestroy();
    }       
}

そして libsに google-play-services.jar を置く

Manifest

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.murasamelabo.mimico"
      android:versionCode="1"
      android:versionName="1.0">

    <uses-sdk android:minSdkVersion="9"
              android:targetSdkVersion="18" />
    <uses-feature android:glEsVersion="0x00020000" />

    <application android:label="@string/app_name"
                 android:icon="@drawable/icon">

         <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version"/>

        <activity android:name="com.murasamelabo.mimico.MainActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:configChanges="orientation|keyboardHidden|screenSize">

            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                       android:value="cocos2dlua" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    </application>

    <supports-screens android:anyDensity="true"
                      android:smallScreens="true"
                      android:normalScreens="true"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest> 

自分のアプリ用に 適宜かきかえてください

Build

3.0rc では cocosコマンドでビルド実行ですね

$cocos run -j4 -p android

エラーが出ます
configChangesの値が 対応してないようです。

project.propertyを見ると target=android-10
となっており、AndroidSDK-10 では対応していないようです

がしかし project.propertyは ビルドのたびに上書きされるので
ここを target=android-18 等にしても 再び 10に戻されだめです

フラグを削除すると実行時に configChangesの値が足りないと AdMobが起動しません

ということで

奥の手

Build.xml の    
<loadproperties srcFile="project.properties" /><loadproperties srcFile="project2.properties" />
等にかえ、該当ファイルを target=android-18 と設定すれば

動いた!!

備考

cocosコマンドにて project.property を作成しているようで
tools/cocos2d-console/bin/cocos.py にて

cocos.py
def select_default_android_platform():
    sdk_root = check_environment_variable('ANDROID_SDK_ROOT')
    platforms_dir = os.path.join(sdk_root, "platforms")
    if os.path.isdir(platforms_dir):
       for num in range (10, 19+1):
           android_platform = 'android-%s' % num
           if os.path.isdir(os.path.join(platforms_dir, android_platform)):
               Logging.info('%s is found' % android_platform)
               return num
    return None

ここで sdk-10に設定されているようです

正しい解決法知っている人教えてください!

6
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6