本指南将演示如何将结合了 Firebase 的 AdMob 添加到新建的 Cocos2d-x 项目中。如果您还没有项目,则应先满足前提条件,然后再通过命令行新建一个 cocos 项目:
cocos new MyGame -l cpp
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) ... #endif
前提条件
您的开发机器上必须安装以下工具:
- 最新版本的 Cocos2d-x
- Python 2.7 或更高版本
- NDK r10d 或更高版本(仅 Android 开发需要)
- CocoaPods 1.0.0 或更高版本(仅 iOS 开发需要)
获取内置了 AdMob 功能的 Firebase C++ SDK
下载 Firebase C++ SDK。
将文件解压缩到 Cocos2d-x 项目的顶层目录中,此目录包含 proj.android-studio
目录和 proj.ios_mac
目录。将文件夹命名为 firebase_cpp_sdk
。
设置 iOS
以下步骤说明了如何将 Firebase SDK 导入到新建的 Cocos2d-x iOS 项目中。
按照相应步骤将 Firebase 添加到您的应用。完成之后,
proj.ios_mac/
目录中的 Xcode 项目应该会引用一个GoogleService-Info.plist
文件。在您的
proj.ios_mac/
目录中创建一个 Podfile,其中包含以下内容:source 'https://github.com/CocoaPods/Specs.git' platform :ios, '7.0' # Replace "MyGame" with the name of your game. target 'MyGame-mobile' do pod 'Firebase' pod 'Firebase/AdMob' end
运行
pod update
以安装 CocoaPods,然后按照 CocoaPods 的说明打开MyGame.xcworkspace
。此时,您的项目中已包含 Firebase iOS SDK 和 Google 移动广告 SDK。CocoaPods 会发出一些警告,提示少量属性缺失
$(inherited)
。转到 Xcode 中 MyGame-mobile 目标的构建设置,然后将$(inherited)
添加到以下每项构建设置的列表底部:- Other Linker Flags
- Preprocessor Macros
- Library Search Paths
在构建设置中,将
$(PROJECT_DIR)/../firebase_cpp_sdk/frameworks/ios/universal
添加到 Framework Search Paths,并将$(PROJECT_DIR)/../firebase_cpp_sdk/include
添加到 Header Search Paths。接下来,您需添加对要使用的库的引用。右键点击您的项目,然后选择 Add Files to "MyGame"。 在
firebase_cpp_sdk/frameworks/ios/universal
目录中,选择firebase.framework
和firebase_admob.framework
。 在添加相应框架之前,取消选中 Copy Items if Needed 选项。通过您在上一步中添加的构建设置,Xcode 可了解在哪里查找这些框架。转到 Build Phases > Link Binary with Libraries,在其下添加
GameController.framework
。按照 AdMob 的应用传输安全指南操作,确保所有广告都能在 iOS 9 及更高版本上正常运作。
检查点:您应该能从 Xcode 构建并运行 iOS 应用。
现在,您的 iOS 项目已经设置成与 AdMob 和 Firebase 相集成。 您可以设置 Android 项目了。
设置 Android
以下步骤说明了如何将 Firebase SDK 导入到新建的 Cocos2d-x Android 项目中。
打开
proj.android-studio/app/jni/Android.mk
,然后添加下方以粗体显示的各行内容。确保将FIREBASE_CPP_SDK_DIR
设置为您刚下载的 Firebase C++ SDK 的本地路径。LOCAL_PATH := $(call my-dir) # The path to the Firebase C++ SDK, in the project's root directory. FIREBASE_CPP_SDK_DIR := ../../../firebase_cpp_sdk APP_ABI := armeabi-v7a x86 STL := $(firstword $(subst _, ,$(APP_STL))) FIREBASE_LIBRARY_PATH := $(FIREBASE_CPP_SDK_DIR)/libs/android/$(TARGET_ARCH_ABI)/$(STL) include $(CLEAR_VARS) LOCAL_MODULE := firebase_app LOCAL_SRC_FILES := $(FIREBASE_LIBRARY_PATH)/libapp.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(FIREBASE_CPP_SDK_DIR)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := firebase_feature LOCAL_SRC_FILES := $(FIREBASE_LIBRARY_PATH)/libadmob.a LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(FIREBASE_CPP_SDK_DIR)/include include $(PREBUILT_STATIC_LIBRARY) include $(CLEAR_VARS) $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d) $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/external) $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos) $(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos/audio/include) LOCAL_MODULE := MyGame_shared LOCAL_MODULE_FILENAME := libMyGame LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../../Classes/AppDelegate.cpp \ ../../../Classes/HelloWorldScene.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes # _COCOS_HEADER_ANDROID_BEGIN # _COCOS_HEADER_ANDROID_END LOCAL_STATIC_LIBRARIES := cocos2dx_static LOCAL_STATIC_LIBRARIES += firebase_app LOCAL_STATIC_LIBRARIES += firebase_feature # _COCOS_LIB_ANDROID_BEGIN # _COCOS_LIB_ANDROID_END include $(BUILD_SHARED_LIBRARY) $(call import-module,.) # _COCOS_LIB_IMPORT_ANDROID_BEGIN # _COCOS_LIB_IMPORT_ANDROID_END
检查您是否仍能编译 Cocos 应用:
cocos compile -p android --ap android-24 --android-studio --app-abi armeabi-v7a
按照相应步骤将 Firebase 添加到您的应用(此应用位于
proj.android-studio/
目录中)。在您的
app/build.gradle
中添加广告软件包:implementation 'com.google.firebase:firebase-ads:21.0.0'
检查您是否仍能编译 Cocos 应用:
cocos compile -p android --ap android-42 --android-studio --app-abi armeabi-v7a
您的 Android 项目现在引用了 Firebase C++ SDK 中的 AdMob 组件。
C++ 集成
现在,Firebase C++ SDK 中已引用您的 iOS 和 Android 项目,接下来要开始使用 SDK 并加载一些广告。
初始化 Firebase 和 AdMob
建议您在应用生命周期中尽早初始化 Firebase 和 AdMob。要为 Cocos2d-x 项目添加这些初始化代码,最适合的地方是在 AppDelegate.cpp
文件中:
AppDelegate.cpp
#include "firebase/app.h" #include "firebase/admob.h" USING_NS_CC; bool AppDelegate::applicationDidFinishLaunching() { ... #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // Initialize Firebase for Android. firebase::App* app = firebase::App::Create( firebase::AppOptions(), JniHelper::getEnv(), JniHelper::getActivity()); // Initialize AdMob. firebase::admob::Initialize(*app, "INSERT_YOUR_ADMOB_ANDROID_APP_ID"); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) // Initialize Firebase for iOS. firebase::App* app = firebase::App::Create(firebase::AppOptions()); // Initialize AdMob. firebase::admob::Initialize(*app, "INSERT_YOUR_ADMOB_IOS_APP_ID"); #endif // Initialize AdMob. firebase::admob::Initialize(*app); // Create a scene. it's an autorelease object. auto scene = HelloWorldScene::createScene(); // run director->runWithScene(scene); return true; }
在 Android 上,创建 Firebase 应用需要一个 JNI 环境和 Activity。上面的示例代码使用 Cocos2d-x 中的 JniHelper
类来提供这些参数。
获取广告父级对象
AdMob 需要 firebase::admob::AdParent
对象来初始化每种广告格式。此对象对应于 Android 上的 Activity
和 iOS 上的 UIView
。以下辅助类会创建单个 getAdParent()
方法,该方法可根据平台返回相应对象。
FirebaseHelper.h
#ifndef __FIREBASE_HELPER_H__
#define __FIREBASE_HELPER_H__
#include "firebase/admob/types.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
extern "C" {
#include <objc/objc.h>
} // extern "C"
#endif
// Returns a variable that describes the ad parent for the app. On Android
// this will be a JObject pointing to the Activity. On iOS, it's an ID pointing
// to the root view of the view controller.
firebase::admob::AdParent getAdParent();
#endif // __FIREBASE_HELPER_H__
FirebaseHelper.cpp
#include "FirebaseHelper.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#endif
USING_NS_CC;
firebase::admob::AdParent getAdParent() {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
// Returns the iOS RootViewController's main view (i.e. the EAGLView).
return (id)Director::getInstance()->getOpenGLView()->getEAGLView();
#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
// Returns the Android Activity.
return JniHelper::getActivity();
#else
// A void* for any other environments.
return 0;
#endif
}
将此 FirebaseHelper 类添加到项目的 Classes/
文件夹中。确保将此文件添加到适用于 iOS 的 Xcode 项目中,并更新用于 Android 的 Android.mk 中的本地源文件:
LOCAL_SRC_FILES := hellocpp/main.cpp \ ../../../Classes/AppDelegate.cpp \ ../../../Classes/HelloWorldScene.cpp \ ../../../Classes/FirebaseHelper.cpp
加载横幅广告
以下示例完整地演示了如何使用上文定义的 getAdParent()
方法加载横幅广告。
#include "FirebaseHelper.h"
#include "firebase/admob.h"
#include "firebase/admob/types.h"
#include "firebase/app.h"
#include "firebase/future.h"
#include "firebase/admob/banner_view.h"
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <android/log.h>
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#endif
USING_NS_CC;
bool HelloWorld::init()
{
// General scene setup ...
#if defined(__ANDROID__)
// Android ad unit IDs.
const char* kBannerAdUnit = "ca-app-pub-3940256099942544/6300978111";
#else
// iOS ad unit IDs.
const char* kBannerAdUnit = "ca-app-pub-3940256099942544/2934735716";
#endif
// Create and initialize banner view.
firebase::admob::BannerView* banner_view;
banner_view = new firebase::admob::BannerView();
firebase::admob::AdSize ad_size;
ad_size.ad_size_type = firebase::admob::kAdSizeStandard;
ad_size.width = 320;
ad_size.height = 50;
banner_view->Initialize(getAdParent(), kBannerAdUnit, ad_size);
// Schedule updates so that the Cocos2d-x update() method gets called.
this->scheduleUpdate();
return true;
}
void HelloWorld::update(float delta) {
// Check that the banner has been initialized.
if (banner_view->InitializeLastResult().status() ==
firebase::kFutureStatusComplete) {
// Check that the banner hasn't started loading.
if (banner_view->LoadAdLastResult().status() ==
firebase::kFutureStatusInvalid) {
// Make the banner visible and load an ad.
CCLOG("Loading a banner.");
banner_view->Show();
firebase::admob::AdRequest my_ad_request = {};
banner_view->LoadAd(my_ad_request);
}
}
}
后续步骤
现在,您已将包含移动广告 SDK 的 Firebase 集成到您的 Cocos2d-x 项目中,可以与移动广告 SDK 进行交互并实现您的首选格式了: