Pull to refresh

Подключаем AdMob рекламу в Мармеладе (расширение для ОС Android)

Reading time 5 min
Views 4.7K
При разработке кроссплатформенных игр и приложений, большинство разработчиков выпускают Android версию своей игры платной либо бесплатной (с рекламой), и зачастую полную платную версию + lite бесплатную, опять же — с рекламой.

При разработке игры с использованием Marmalade (бывшая Airplay SDK), возникла необходимость внедрения рекламы (в рамках данной статьи в качестве примера используется AdMob), и поскольку толковой информации, примеров и туториалов нигде нету, пришлось копать самому. В результате всё оказалось не так уж и сложно.

И так, что нам необходимо:
  1. Marmalade SDK 5.0 и выше (в рамках статьи использовалась 5.0 версия)
  2. Android NDK r5 (с установленными в требованиях инструментами и системной переменной NDK_ROOT)
  3. GoogleAdMobAdsSdk-4.1.0.jar

Создаем расширение (extension)


Заходим в директорию где установлен Мармелад, папка с расширениями (например c:\Marmalade\5.0\extensions), и создаем свою папку с названием нового расширения AdmobAds. Желательно чтобы расширение находилось в директории с другими расширениями.
Теперь необходимо создать текстовый документ AdmobAds.s4e, который должен содержать следующее:
#include <s3eTypes.h>

functions:
s3eResult InitAds(const char* pub_id) S3E_RESULT_ERROR run_on_os_thread
s3eResult ShowAds() S3E_RESULT_ERROR run_on_os_thread
s3eResult HideAds() S3E_RESULT_ERROR run_on_os_thread

Это означает что расширение будет иметь 3 метода:
  • InitAds() который будет принимать на вход в качестве параметра publisher_id
  • ShowAds() — показать рекламу
  • HideAds() — спрятать рекламу


Теперь необходимо сгенерировать код расширения для Android, для этого нажимаем правой клавишей на AdmobAds.s4e и выбираем Build Android Extension. После чего в папке source будет сгенерирован шаблонный исходный код для java и cpp, и другие вспомогательные файлы.

image

После того, как был сгенерирован код, открываем ...\AdmobAds\source\android\AdmobAds.java который в свою очередь содержит метод описанный в AdmobAds.s4e:
/*
java implementation of the AdmobAds extension.

Add android-specific functionality here.

These functions are called via JNI from native code.
*/
/*
 * NOTE: This file was originally written by the extension builder, but will not
 * be overwritten (unless --force is specified) and is intended to be modified.
 */
import com.ideaworks3d.marmalade.LoaderAPI;

class AdmobAds
{
	
    public int InitAds(final String pub_id)
    {
        return 0;
    }

    public int ShowAds()
    {
        return 0;
    }
    
    public int HideAds()
    {
        return 0;
    }
}


Внимание: метод выполняется не в UI потоке, и для отображения того же Toast необходимо добавить запуск его через runOnUiThread:

import com.ideaworks3d.marmalade.LoaderActivity;    
import android.widget.Toast;

    ...    

    public int InitAds(final String pub_id)
    {
    	LoaderActivity.m_Activity.runOnUiThread(new Runnable() {
			@Override
			public void run() {
				Toast.makeText(LoaderActivity.m_Activity,pub_id,Toast.LENGTH_LONG).show();
			}
		});
        return 0;
    }

LoaderActivity.m_Activity — основная активити приложения, её в случае необхдимости можно наследовать.

Теперь проверим как все работает, двойным кликом запускаем
  1. AdmobAds_android.mkb
  2. AdmobAds_android_java.mkb

Если всё было выполнено корректно то build failed не должно наступить.

Для того, чтобы подключить расширение к проекту необходимо выполнить пару шагов:
  • Для примера скопировать HelloWorld example
  • Добавить в s3eHelloWorld.mkb под-проект (extension)

subprojects
{
	AdmobAds
}

  • Сохранить и открыть (будут сгенерированы зависимости и прилинкован экстеншн к проекту)
  • Добавить в s3eHelloWorld.cpp следующие изменения:

#include "AdmobAds.h"

int main()
{
	if(AdmobAdsAvailable()){
		InitAds("a14bd815...");
	}

Метод AdmobAdsAvailable() генерируется автоматически при создании расширения, и возвращает true в случае если расширение доступно для данной платформы (т.е. в нашем случае для Android будет true а для iOS, win и др. вернет false).

Выполнив компиляцию GCC ARM (Release), запускаем инструмент экспорта (Deployment tool), указываем из build директории deploy_config.py файл, выбираем из списка платформ Android, жмем Deply All. После этого запускаем экспорт приложения под выбранные платформы. В случае успешного билда загружаем apk файл на телефон(!) и проверяем

Увидели Toast — значит всё отлично, теперь осталось подключить Admob рекламу

Добавление рекламы в AdmobAds расширение


Откроем и отредактируем ранее описанный исходный код расширения AdmobAds.java и добавим туда рекламу:
import android.view.ViewGroup.LayoutParams;
import android.view.View;
import android.widget.Toast;

import com.google.ads.Ad;
import com.google.ads.AdRequest;
import com.google.ads.AdRequest.ErrorCode;
import com.google.ads.AdSize;
import com.google.ads.AdView;
import com.ideaworks3d.marmalade.LoaderAPI;
import com.ideaworks3d.marmalade.LoaderActivity;

class AdmobAds
{
    private static final int ADVIEW_NOT_INITIALIZED = 1;
    private AdView adView;
	
    public int InitAds(final String pub_id)
    {
    	LoaderActivity.m_Activity.runOnUiThread(new Runnable() {
			@Override
			public void run() {
				Toast.makeText(LoaderActivity.m_Activity,pub_id,Toast.LENGTH_LONG).show();
				
				adView = new AdView(LoaderActivity.m_Activity, AdSize.BANNER, pub_id);
				adView.loadAd(new AdRequest());
				LoaderActivity.m_Activity.addContentView(adView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
			}
		});
        return 0;
    }
    public int ShowAds()
    {
	if(adView!=null){
		LoaderActivity.m_Activity.runOnUiThread(new Runnable() {
			@Override
			public void run() {
				adView.setVisibility(View.VISIBLE);
			}});
	} else { 
		return ADVIEW_NOT_INITIALIZED; 
	}

        return 0;
    }
    public int HideAds()
    {
	if(adView!=null){
		LoaderActivity.m_Activity.runOnUiThread(new Runnable() {
			@Override
			public void run() {
				adView.setVisibility(View.INVISIBLE);
			}});
	} else { 
		return ADVIEW_NOT_INITIALIZED; 
	}
        return 0;
    }
}

Как видите, ничего необычного нет, стандартный пример кода внедрения рекламы из вики AdMob'a

Запускаем
  • AdmobAds_android.mkb
  • Редактируем AdmobAds_android_java.mkb и добавляем туда путь к GoogleAdMobAdsSdk-4.1.0.jar

#!/usr/bin/env mkb
# Builder mkb file for the java portion of the AdmobAds extension on android
platform JAVA

files
{
    (source/android)
    AdmobAds.java
}

librarypath "$MARMALADE_ROOT/s3e/deploy/plugins/android/android.jar"
librarypath "$MARMALADE_ROOT/s3e/loader/android/s3e_release.jar"
librarypath "c:/Marmalade/5.0/examples/HelloWorld_java/GoogleAdMobAdsSdk-4.1.0.jar"

option output-name=lib/android/AdmobAds.jar

  • Выполняем AdmobAds_android_java.mkb


Теперь необходимо отредактировать s3eHelloWorld.mkb и добавить туда
deployments
{
	android-manifest=AndroidManifest.xml
	android-external-jars=GoogleAdMobAdsSdk-4.1.0.jar
}


AndroidManifest.xml можно скопировать сгенерированный (рядом с .apk файлом есть директория intermediate_files) и добавить туда:
    <activity android:name="com.google.ads.AdActivity"
              android:configChanges="keyboard|keyboardHidden|orientation"/>

...

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


Теперь повторяем процедуру экспорта, загружаем на телефон:


На android эмуляторе почему то вылетает, видимо не всегда дружит с мармеладом, но данный пример проверен и работает на телефонах Nexus S, huawei u8110, huawei ideos u8150, Samsung i5500

За основу бралась информация из следующих источников
Google AdMob Ads Android Fundamentals
EDK tutorial
Marmalade documentation

По просьбе ребят из Marmalade выложил на их гите исходники (внимание HelloWorld немного изменен — добавлена возможность показать/спрятать рекламу)
https://github.com/marmalade/admob
Tags:
Hubs:
+6
Comments 0
Comments Leave a comment

Articles