Cocos2d-xのWin32プロジェクトにFirebaseを設定する

Android向けにアプリ開発していますが、プログラムを書くときはWin32プロジェクトで作成しているのでモバイルプラットフォーム向けのライブラリとか機能は特別な分岐コードを書かないといけないのですが、FirebaseはAndroid, iOSは対応していますがWindowsとかMacでも疑似的に動かせる(=分岐コードが最小限に抑えられかつ多少動作が見れる)とのことらしいので早速自分のWin32プロジェクトに設定してみました。

以下のページには

GoogleのFirebase導入方法のページ

ゲームを作成する場合、通常はまずデスクトップ プラットフォームでゲームをテストしてから、開発中のモバイル デバイスにデプロイしてテストする方が簡単になります。このワークフローをサポートするために、Windows、OS X、Linux、および C++ エディタ内で実行できる Firebase C++ のサブセットが用意されています。

とあっり、Win32のプロジェクトでFirebaseをリンクしてコンパイルする方法は具体的な手順は無かったため、設定の仕方をまとめてみました。

因みにAndroidの設定はマニュアルがちゃんとあるのでそれ見て作業すればOKという事でここでは説明除外します。iOSは…Mac持ってないのでよくわかりません。

確認環境

以下の環境で確認しています。

  • Windows10
  • VisualStudio 2017 (15.9.14)
  • WindowsSDK 10.0.17763.0
  • Cocos2d-x 3.17.1
  • Firebase C++SDK 6.4.0

ファイルの配置構成

ファイル配置は以下のようになっています。

${フォルダ}/
  ├ my_app/    // ← 自分のアプリ
  └ firebase_cpp_sdk/    // ← firebaseのフォルダ6.4.0/

このSDK、バージョンの変化が割と早いみたいなので落としたzipは大切にとっておきましょう。

設定手順

まずは、公式の解説ページの「Firebase C++ SDK」のダウンロードというリンクをクリックしてSDKを入手し中身を回答し前述の構成に配置します。SDK内にWindows用のビルド済みのスタティックライブラリがいくつかの種類で配置済みなのでそれを利用していく形になります。

(1) SDK内のヘッダーファイルを見えるようにする

SDK内のヘッダーファイルをWin32プロジェクトから参照できるように以下設定を行います。

構成プロパティ > C/C++ > 全般 > [追加のインクルード ディレクトリ]

以下を追加します。

// Debug/Release 共通
..\..\firebase_cpp_sdk\6.4.0\include

f:id:Takachan:20190904205136p:plain

(2) スタティックライブラリの名前を指定する

リンクするスタティックライブラリの名前を設定します。

構成プロパティ > C/C++ > 入力 > [追加の依存ファイル]

とりあえず全部追加してみる。機能別になっているようなので不要なものは外してもよさそう。

// Debug/Release共通
crypt32.lib // ← もっと順序が上の方がいいかもしれない
firebase_instance_id.lib
firebase_messaging.lib
firebase_remote_config.lib
firebase_storage.lib
firebase_admob.lib
firebase_analytics.lib
firebase_app.lib
firebase_auth.lib
firebase_database.lib
firebase_dynamic_links.lib
firebase_functions.lib

f:id:Takachan:20190904203558p:plain

(3) スタティックライブラリのフォルダパスの指定

上記の名前のライブラリがどのフォルダにあるのかを設定します。

構成プロパティ > VC++ ディレクトリ > [ライブラリディレクトリ]

以下設定をデバッグ、リリース構成別々に入力します。

// Debugビルドの指定
C:\[${自分の環境のフォルダパス}]\firebase_cpp_sdk\6.4.0\libs\windows\VS2015\MD\x86\Debug

// Releaseビルドの指定
C:\[${自分の環境のフォルダパス}]\firebase_cpp_sdk\6.4.0\libs\windows\VS2015\MD\x86\Release

f:id:Takachan:20190904203945p:plain

必ずフルパスで指定してください。相対パスは効きません。

確認事項そのほか

自分のプロジェクトがMTかMDかの確認方法

アプリのプロジェクトのプロパティから以下を確認。

構成プロパティ > C/C++ > コード生成 > [ランタイム ライブラリ]

MD : "マルチスレッド DLL" or "マルチスレッド デバッグ DLL" MT : "マルチスレッド" or "マルチスレッド デバッグ"

何もしていなければ"MD"が指定されているはず。

自分のプロジェクトが32bitか64bitかの確認方法

同じく、アプリのプロジェクトのプロパティから以下を確認。

構成プロパティ > C/C++ > リンカー > 詳細設定 > [対象コンピューター]

32bit : MachineX86 64bit : MachineX64

何もしてなければ32bitになってるはず。

セットアップしてみる

ビルドする前に、最低限のセットアップをします。公式の説明の通り完全な機能の動作は期待していないため、実際にデスクトップで広告が出るとかは確認しません。あくまで最低限の初期化をしてビルドが通る状態まで設定したいと思います。

公式にドキュメントがあるのでその通りにします。

Firebaseの初期化を行う箇所に以下を記述します。

// TestScebe.cpp

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform\android\jni\JniHelper.h"
#endif

#include "FirebaseHelper.hpp"

#include "firebase\app.h"
#include "firebase\admob.h"

void TestScene::test_firebase()
{
    using namespace firebase;

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    App* app = App::Create(AppOptions(), JniHelper::getEnv(), JniHelper::getActivity());
    admob::Initialize(*app, "INSERT_YOUR_ADMOB_ANDROID_APP_ID");

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

    App* app = App::Create(firebase::AppOptions());
    admob::Initialize(*app, "INSERT_YOUR_ADMOB_APP_ID");

#endif

    admob::BannerView* banner_view = new admob::BannerView();
}

そしてビルド。

f:id:Takachan:20190904204824p:plain

成功しました。ちょっとPDB(デバッグシンボル)が無いと怒られていますがこのままアプリを起動して問題ありませんでした。

あとは公式の説明通り進めればWin32の時だけ#ifdef切ったり特別なことはそんなにしないでも進められるはず…!

最後に

すいません、このままAndroidで広告が表示される状態までもっていってwin32で見た目がどうなるか書きたかったのですがそこまで確認できていません。

この後の工程も確認できれば別途記事を更新します。

次の記事です。匿名認証を確認しました。

takachan.hatenablog.com

以上です。