使用c++开发Admob可以构建跨平台的广告集成体验,不用为不同平台编写原生语言的广告集成代码,也更加方便纯native开发的软件进行广告植入。通过官方教程和demo的研究, 踩了若干坑之后,终于在native code构建的游戏里顺利集成了c++接口的Admob。文本将会详细介绍,集成过程和遇到的问题及解决方法。

首先,查看官方教程。注意点,不要看中文的页面介绍,因为版本配置包括sdk下载链接都落后于英文版本,可能会导致配置不成功。

Android studio 的配置说明 https://firebase.google.com/docs/android/setup,主要有三个地方需要我们设置。

1. 到 Firebase console控制台创建应用,然后下载google-services.json文件,放到Android stuido app根目录下面。

2. 配置Project级别的Gradle的路径依赖。

3. 配置app级别的Gradle的编译依赖。

这里只使用了admob,所以只依赖一个firebase-asd,其它的功能参看文档给的Available libraries依赖表。需要注意的是,apply plugin 需要在最后一行。

//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Firebase C++ SDK 的配置,https://firebase.google.com/docs/cpp/setup,主要有四点需要我们配置。

1. 下载 Firebase C++ SDK , 官方文档给了最新的版本。查看各个功能对库的依赖Dependencies,比如Admob依赖libapp.a和libadmob.a。后面说明如何配置这两个库文件。

2. 配置Firebase SDK的目录在Android stuido里的定位。文档仅仅给出了一句话,systemProp.firebase_cpp_sdk.dir=~/your_local_firebase_sdk_dir 配置在 gradle.properties 文件里。然后我发现并不起作用,查看了官方的demofirebase/quickstart-cpp 是NDK-build的模式。经过我的摸索找到了cmake的配置方法如下。我们需要手动添加project.ext属性。

3. 配置 ProGuard 混淆代码的配置,我们需要针对需要的库文件配置,否则无法正确运行。经过上一步的配置,就可以正确找到firebase sdk的文件位置了。需要注意的是release, debug都需要加入ProGuard配置。

4. 最后需要在cmake配置中,加入我们依赖的库文件。libapp.a 和 libadmob.a。

#####################################################################add_library(firebase_appSTATICIMPORTED
)set_target_properties(firebase_appPROPERTIES IMPORTED_LOCATION${FIREBASE_CPP_SDK_DIR}/libs/android/${ANDROID_ABI}/c++/libapp.a
)#####################################################################add_library(firebase_admobSTATICIMPORTED
)set_target_properties(firebase_admobPROPERTIES IMPORTED_LOCATION${FIREBASE_CPP_SDK_DIR}/libs/android/${ANDROID_ABI}/c++/libadmob.a
)#####################################################################include_directories(../../../${FIREBASE_CPP_SDK_DIR}/include/../
)#####################################################################add_library(FireBaseTool STATIC../FireBaseTool.cpp
)target_link_libraries(FireBaseToolfirebase_admobfirebase_app
)

我们可以看到FIREBASE_CPP_SDK_DIR目录,有多个STL版本的库文件。这里我写死了c++文件夹目录。也可以执行配置,后面说明。这里,我建立了一个工具类FireBaseTool,专门用来控制广告展示的,编译成一个库文件,在链接进入项目的库中。

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

另外,在cmake配置中,使用了FIREBASE_CPP_SDK_DIR的目录设置,需要在Gradle文件里面进行配置的。

-DANDROID_STL=c++_static 就是配置STL类型使用的配置,只是我在cmake里写死了c++。

通过以上配置,就可以在Android studio里面使用c++来展示Admob广告了。

我们看代码如何使用。首先,我们可以参看官方demo给出的代码示例,https://github.com/firebase/quickstart-cpp/blob/master/admob/testapp/src/common_main.cc。

其次,给出我的一个封装,仅仅是插页广告的展示。

//
// Created by scott.cgi
//#include <android/native_activity.h>#include "FireBaseTool.h"
#include "firebase/admob.h"extern ANativeActivity* nativeActivity;static const char* kAdMobAppID         = "Admob应用的Id";
static const char* kInterstitialAdUnit = "广告单元的Id";
static const char* kTestDeviceIds[]    = {"测试手机的Id, 在logcat中可以找到链接手机的Id"};static firebase::admob::InterstitialAd* interstitialAd;
static firebase::admob::AdRequest       adRequest;static void OnLoadCompletion(const firebase::Future<void>& future, void* user_data)
{if (future.Error() == firebase::admob::kAdMobErrorNone){interstitialAd->Show();}
}static void OnInitCompletion(const firebase::Future<void>& future, void* user_data)
{if (future.Error() == firebase::admob::kAdMobErrorNone){interstitialAd->LoadAd(adRequest);
//        interstitialAd->LoadAdLastResult().OnCompletion(OnLoadCompletion, NULL);}
}static void Init()
{JNIEnv* env;nativeActivity->vm->AttachCurrentThread(&env, nullptr);// create the firebase appfirebase::App* app = firebase::App::Create(firebase::AppOptions(),env,nativeActivity->clazz);// init the AdMob library.firebase::admob::Initialize(*app, kAdMobAppID);//--------------------------------------------------------------------------------------------------interstitialAd = new firebase::admob::InterstitialAd();interstitialAd->Initialize(static_cast<firebase::admob::AdParent>(nativeActivity->clazz), kInterstitialAdUnit);interstitialAd->InitializeLastResult().OnCompletion(OnInitCompletion, NULL);//--------------------------------------------------------------------------------------------------adRequest.gender                              = firebase::admob::kGenderUnknown;adRequest.tagged_for_child_directed_treatment = firebase::admob::kChildDirectedTreatmentStateUnknown;//    adRequest.test_device_id_count                = sizeof(kTestDeviceIds) / sizeof(kTestDeviceIds[0]);
//    adRequest.test_device_ids                     = kTestDeviceIds;//--------------------------------------------------------------------------------------------------
}static bool isShown = false;static void Show()
{if(interstitialAd->LoadAdLastResult().Status() == firebase::kFutureStatusComplete  &&interstitialAd->LoadAdLastResult().Error()  == firebase::admob::kAdMobErrorNone){isShown = true;interstitialAd->Show();}
}static void Refresh()
{if (isShown){isShown = false;interstitialAd->LoadAd(adRequest);}
}struct AFireBaseTool AFireBaseTool[1] =
{Init,Show,Refresh,
};

关于API的使用和功能参看官方文档,https://firebase.google.com/docs/admob/cpp/quick-start。

需要注意的是,firebase创建app的时候,参数 JNIEnv* env 需要的是从当前线程新获得的,而不是 nativeActivity 自己的那个成员变量 env.

JNIEnv* env;nativeActivity->vm->AttachCurrentThread(&env, nullptr);// create the firebase appfirebase::App* app = firebase::App::Create(firebase::AppOptions(),env,nativeActivity->clazz);

Android Studio使用cmake配置c++开发Admob相关推荐

  1. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  2. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...

  3. 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

    文章目录 I . 源码编译配置 II . 构建脚本配置 III . NDK 函数库打包配置 IV . Java 与 C 代码示例 V . CMake 配置 ( CMakeLists.txt ) VI ...

  4. 26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)

    Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有 ...

  5. 开发工具(Windows):Android Studio安装与配置

    Android Studio安装与配置 背景 安装Android Studio 本机环境 安装JDK 下载 安装 配置 安装模拟器加速器 背景 作为Google推出的,为Android"量身 ...

  6. Android Studio 4.0.+NDK项目开发详细教学

    JNI开发系列目录 JNI开发必学C++基础 JNI开发必学C++使用实践 Android Studio 4.0.+NDK项目开发详细教学 Android NDK与JNI的区别有何不同? Androi ...

  7. android sdl 插件,Android Studio用cmake编译SDL2

    先说SDL(Simple DirectMedia Layer)的作用吧,SDL是套跨平台的多媒体库,代码是用c语言写的,在Android应用开发上多是和FFmpeg合作来开发我们常用的视音频播放器.关 ...

  8. Mac下Android studio 之NDK配置教程(一)

    Mac下Android studio 之NDK配置教程(一) 1.概述 近期项目全线转移到Mac下使用使用Android studio开发. 遇到关键代码封装到 ***native***层,此时在wi ...

  9. 【转】Android studio安装与配置

    Android studio安装与配置 1.首先下载Android studio安装包,可以从http://www.android-studio.org/下载最新版本,这里采用3.0版本进行演示,对应 ...

最新文章

  1. Linux系统中的Page cache和Buffer cache
  2. assembly x86(nasm)画三角形等图形的实现(升级版)
  3. c语言比较麻烦的编程题,C语言编程题,比较简单
  4. Spring的IOC原理
  5. 解决SimpleButton被移除后保持OVER状态
  6. 用递归法求1²+2²+...+n²的值
  7. 生产者消费者代码c语言_由生产者消费者模型引出的线程同步问题
  8. 关于_beginthreadex、_beginthread和CreateThread
  9. 怎样设置计算机默认字体及语言,电脑win10系统怎么将paint 3D的语言设置为中文...
  10. Python 标准库 —— fractions
  11. 三星note10 android q,【极光ROM】-【三星NOTE10/NOTE10+/5G N97XX-855】-【V6.0 Android-Q-TE1】...
  12. java项目学生量化管理考核细则_班级管理量化考核细则范本
  13. 一道按顺序排列组合题的几种解法
  14. 力扣OJ 剑指 Offer(1-30)
  15. 如何将List集合存入数据库,解决方案
  16. HTTP的常用方法、GET和POST的区别
  17. 【它山之玉】博士三年发表论文回顾—科学网马臻
  18. 推荐一个轻便好用的随时记录的便签类app
  19. 5G的哀伤,4G手机占比再创10个月来新高,买5G手机的消费者减少了
  20. 了解您最新Gmail 邮箱

热门文章

  1. 51单片机七人多数表决器仿真设计( proteus仿真+程序+报告+讲解视频)
  2. educoder平台哪里有答案_作业答案辅导平台下载-作业答案辅导软件下载v2.0 安卓免费版...
  3. 常用的vim良好插件
  4. VS2019 创建第一个.Net Core ABP项目
  5. 微信小程序border padding margin
  6. CSS-200个小案例(一)
  7. 哪些主板支持三代服务器内存,支持三代内存的主板CPU有哪些
  8. RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略
  9. 华为防火墙做单臂路由_华为-VLAN间路由:VLANIF+单臂路由(子接口)-释然
  10. FAT32和NTFS最大支持的单个文件大小分别是多大?