如何将结合了 Firebase 的 AdMob 添加到新建的 Cocos2d-x 项目

本文介绍如何将结合了Firebase的AdMob添加到Cocos2d-x项目中,包括设置iOS和Android项目的过程,以及初始化Firebase和AdMob的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何将结合了 Firebase 的 AdMob 添加到新建的 Cocos2d-x 项目

本指南将演示如何将结合了 Firebase 的 AdMob 添加到新建的 Cocos2d-x 项目中。如果您还没有项目,则应先满足前提条件,然后再通过命令行新建一个 cocos 项目:

cocos new MyGame -l cpp

注意 :AdMob 仅支持为 Android 和 iOS 构建的 Cocos2d-x 应用。桌面应用不受支持。本指南假定您只开发适用于 Android/iOS 的 Cocos 应用,但您可以使用以下 #if 指令封装完整的 AdMob 集成,以确保其仅在移动应用环境中执行:
#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 项目中。

  1. 按照相应步骤将 Firebase 添加至您的应用。完成之后,proj.ios_mac/ 目录中的 Xcode 项目应该会引用GoogleService-Info.plist 文件。

  2. 在您的 proj.ios_mac/ 目录中创建一个 Podfile,其中包含以下内容:

  1. 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
    
    
  2. 运行 pod update 以安装 CocoaPods,然后按照 CocoaPods 的说明打开 MyGame.xcworkspace。此时,您的项目中已包含 Firebase 和 AdMob iOS SDK。

  3. CocoaPods 会发出有关一些属性缺少 $(inherited) 的警告。转到 Xcode 中 MyGame 移动应用目标的构建设置,然后将 $(inherited) 添加到以下每个构建设置的列表底部:

    • Other Linker Flags
    • Preprocessor Macros
    • Library Search Paths
  4. 在构建设置中,将 $(PROJECT_DIR)/../firebase_cpp_sdk/frameworks/ios/universal 添加到 Framework Search Paths,将 $(PROJECT_DIR)/../firebase_cpp_sdk/include 添加到 Header Search Paths

  5. 接下来,您需添加对要使用的库的引用。右键点击您的项目,然后选择 Add Files to "MyGame"。在firebase_cpp_sdk/frameworks/ios/universal 目录中,选择 firebase.framework 和firebase_admob.framework。在添加相应框架之前,取消选中 Copy Items if Needed 选项。通过您在上一步中添加的构建设置,Xcode 可了解在哪里找到这些框架。

  6. 将 GameController.framework 添加至 Build Phases > Link Binary with Libraries

  7. 按照 AdMob 的应用传输安全指南来操作,确保所有广告都能在 iOS 9 及更高版本上正常运行。

检查点:您应该能从 Xcode 构建和运行 iOS 应用。

注意 :使用 CocoaPods 的副作用是,您将无法再在命令行中使用 cocos run -p 构建 iOS 应用

现在,您的 iOS 项目已经与 AdMob 和 Firebase 相集成。 您可以设置 Android 项目了。

设置 Android

以下步骤说明了如何将 Firebase SDK 导入到新建的 Cocos2d-x Android 项目中。

  1. 打开 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 中添加广告包:

  • compile 'com.google.firebase:firebase-ads:11.0.4'
    
    
  • 检查您是否仍能编译 Cocos 应用:

    1. cocos compile -p android --ap android-42 --android-studio --app-abi armeabi-v7a
      
      

    您的 Android 项目现在已经引用 Firebase C++ SDK 中的 AdMob 组件。

    C++ 集成

    现在,您的 iOS 和 Android 项目已在 Firebase C++ SDK 中被引用,接下来便是开始使用 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);
        }
      }
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值