Cocos2d-x v3.17 and Firebase C++ SDK

Hi folks.

I was trying to build my project for Android. I built up my IOS project completely. The documentation was enough to get build it. But I have problems;

One of my files are includes an header file from Firebase C++ SDK.

Error message is:
~/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/…/…/…/…/i686-linux-android/bin/ld: error: cannot find -lfirebase_feature_sk


And my other libraries.

I just follow the guide here: https://firebase.google.com/docs/admob/cpp/cocos2d-x

CMakeLists.txt;

#/****************************************************************************
# Copyright (c) 2013-2014 cocos2d-x.org
# Copyright (c) 2015-2017 Chukong Technologies Inc.
#
# http://www.cocos2d-x.org
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# ****************************************************************************/

cmake_minimum_required(VERSION 3.6)

set(APP_NAME miro)

project(${APP_NAME})

set(COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cocos2d)
set(CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH}/cmake/Modules/)

include(CocosBuildSet)
add_subdirectory(${COCOS2DX_ROOT_PATH}/cocos ${ENGINE_BINARY_PATH}/cocos/core)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/firebase_cpp_sdk/include)

# record sources, headers, resources...
set(GAME_SOURCE)
set(GAME_HEADER)

set(GAME_RES_FOLDER
    "${CMAKE_CURRENT_SOURCE_DIR}/Resources"
    )

if(APPLE OR WINDOWS)
    cocos_mark_multi_resources(common_res_files RES_TO "Resources" FOLDERS ${GAME_RES_FOLDER})
endif()

# add cross-platforms source files and header files
list(APPEND GAME_SOURCE
     Classes/AppDelegate.cpp
     )

list(APPEND GAME_HEADER
     Classes/AppDelegate.h
     Classes/Application.hpp
     Classes/BannerAd.hpp
     Classes/BeforeAdScene.hpp
     Classes/Box.hpp
     Classes/BoxManager.hpp
     Classes/Calculations.hpp
     Classes/FirebaseHelper.hpp
     Classes/FruitBox.hpp
     Classes/GameStruct.hpp
     Classes/Internationalization.hpp
     Classes/InterstitialAd.hpp
     Classes/LevelBox.hpp
     Classes/LevelsScene.hpp
     Classes/MenuScene.hpp
     Classes/Score.hpp
     Classes/ScoreScene.hpp
     Classes/SideManager.hpp
     Classes/SidePlayScene.hpp
     Classes/UserInformation.hpp
     )

if(ANDROID)
    # change APP_NAME to the share library name for Android, it's value depend on AndroidManifest.xml
    set(APP_NAME MyGame)
    set(FIREBASE_SDK_LIBDIR ${CMAKE_CURRENT_SOURCE_DIR}/firebase_cpp_sdk/libs/android/x86/c++)
    list(APPEND GAME_SOURCE
         proj.android/app/jni/hellocpp/main.cpp
         )
elseif(LINUX)
    list(APPEND GAME_SOURCE
         proj.linux/main.cpp
         )
elseif(WINDOWS)
    list(APPEND GAME_HEADER
         proj.win32/main.h
         proj.win32/resource.h
         )
    list(APPEND GAME_SOURCE
         proj.win32/main.cpp
         proj.win32/game.rc
         ${common_res_files}
         )
elseif(APPLE)
    if(IOS)
        list(APPEND GAME_HEADER
             proj.ios_mac/ios/AppController.h
             proj.ios_mac/ios/RootViewController.h
             )
        set(APP_UI_RES
            proj.ios_mac/ios/LaunchScreen.storyboard
            proj.ios_mac/ios/LaunchScreenBackground.png
            proj.ios_mac/ios/Images.xcassets
            )
        list(APPEND GAME_SOURCE
             proj.ios_mac/ios/main.m
             proj.ios_mac/ios/AppController.mm
             proj.ios_mac/ios/RootViewController.mm
             proj.ios_mac/ios/Prefix.pch
             ${APP_UI_RES}
             )
    elseif(MACOSX)
        set(APP_UI_RES
            proj.ios_mac/mac/Icon.icns
            proj.ios_mac/mac/Info.plist
            )
        list(APPEND GAME_SOURCE
             proj.ios_mac/mac/main.cpp
             proj.ios_mac/mac/Prefix.pch
             ${APP_UI_RES}
             )
    endif()
    list(APPEND GAME_SOURCE ${common_res_files})
endif()

# mark app complie info and libs info
set(all_code_files
    ${GAME_HEADER}
    ${GAME_SOURCE}
    )
if(NOT ANDROID)
    add_executable(${APP_NAME} ${all_code_files})
else()
    add_library(${APP_NAME} SHARED ${all_code_files})
    add_subdirectory(${COCOS2DX_ROOT_PATH}/cocos/platform/android ${ENGINE_BINARY_PATH}/cocos/platform)
    target_link_libraries(${APP_NAME} -Wl,--whole-archive cpp_android_spec -Wl,--no-whole-archive)
    link_directories(${FIREBASE_SDK_LIBDIR})
    target_link_libraries(${APP_NAME} firebase_feature_sk firebase_analytics_sk firebase_app_sk)
endif()

target_link_libraries(${APP_NAME} cocos2d)
target_include_directories(${APP_NAME}
        PRIVATE Classes
        PRIVATE ${COCOS2DX_ROOT_PATH}/cocos/audio/include/
)

# mark app resources
setup_cocos_app_config(${APP_NAME})
if(APPLE)
    set_target_properties(${APP_NAME} PROPERTIES RESOURCE "${APP_UI_RES}")
    if(MACOSX)
        set_target_properties(${APP_NAME} PROPERTIES
                              MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/proj.ios_mac/mac/Info.plist"
                              )
    elseif(IOS)
        cocos_pak_xcode(${APP_NAME} INFO_PLIST "iOSBundleInfo.plist.in")
        set_xcode_property(${APP_NAME} ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon")
        set_xcode_property(${APP_NAME} DEVELOPMENT_TEAM "")
        set_xcode_property(${APP_NAME} CODE_SIGN_IDENTITY "iPhone Developer")
    endif()
elseif(WINDOWS)
    cocos_copy_target_dll(${APP_NAME})
endif()

if(LINUX OR WINDOWS)
    set(APP_RES_DIR "$<TARGET_FILE_DIR:${APP_NAME}>/Resources")
    cocos_copy_target_res(${APP_NAME} COPY_TO ${APP_RES_DIR} FOLDERS ${GAME_RES_FOLDER})
endif()

Android.mk

LOCAL_PATH := $(call my-dir)

#--Firebase Compile!-----------------------------------------------
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_sk
LOCAL_SRC_FILES := $(FIREBASE_LIBRARY_PATH)/libfirebase_app.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(FIREBASE_CPP_SDK_DIR)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := firebase_feature_sk
LOCAL_SRC_FILES := $(FIREBASE_LIBRARY_PATH)/libfirebase_admob.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/$(FIREBASE_CPP_SDK_DIR)/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:=firebase_analytics_sk
LOCAL_SRC_FILES:=$(FIREBASE_LIBRARY_PATH)/libfirebase_analytics.a
LOCAL_EXPORT_C_INCLUDES:=$(FIREBASE_CPP_SDK_DIR)/include
include $(PREBUILT_STATIC_LIBRARY)
#------------------------------------------------------------------

include $(CLEAR_VARS)
LOCAL_MODULE := MyGame_shared

LOCAL_MODULE_FILENAME := libMyGame

LOCAL_SRC_FILES := $(LOCAL_PATH)/hellocpp/main.cpp

SK_CLASSES_DIR := $(LOCAL_PATH)/../../../Classes

LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/AppDelegate.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/Application.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/BannerAd.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/BeforeAdScene.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/Box.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/BoxManager.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/FirebaseHelper.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/FruitBox.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/InterstitialAd.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/LevelBox.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/LevelsScene.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/MenuScene.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/Score.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/ScoreScene.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/Shake.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/SideManager.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/SidePlayScene.cpp
LOCAL_SRC_FILES += $(SK_CLASSES_DIR)/UserInformation.cpp

#-----------------------------
LOCAL_STATIC_LIBRARIES := cc_static

#--Firebase static libs
LOCAL_STATIC_LIBRARIES += firebase_analytics_skk
LOCAL_STATIC_LIBRARIES += firebase_app_skk
LOCAL_STATIC_LIBRARIES += firebase_feature_skk
#-----------------------

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes

# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END

# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END

include $(BUILD_SHARED_LIBRARY)

$(call import-module, cocos)

# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END

Thanks.

You could try with sdkbox firebase:
http://docs.sdkbox.com/en/plugins/firebase/v3-cpp/

I don’t want to use SDK Box, due to understand under-layer of my system.

I think, the problem is my make files. I read a lot about make files. But still, this is my first day about it and I couldn’t get it work.

My android studio says O.K. but while compiling, the header file includes are missing.

@tranthor, I have updated my question. Here is the thing, now.

Can you tell me, is it so obvious, or is there a nuance ?

Sorry, i use sdkbox for everything
Maybe other user can help you…

@slackmoehrle, can you help me, please ?

@R101, this is my problem.
If you can help me, I will be grateful.

@scknkkrer I don’t understand why you pasted Android.mk? Ignore that file, since you shouldn’t be using it. You should be building using CMake.

If you’re using v3.17 of Cocos2d-x, then you really need to update to 3.17.1. Do that first, then follow the instructions.

In your/proj.android/gradle.properties file, you should have this:

PROP_BUILD_TYPE=cmake

Make sure your /proj.android/app/gradle.build is updated to reflect what is in the Cocos2d-x 3.17.1 release. If you’re not sure, paste the entire contents of that file in here so we can see.

Have you checked to see if the firebase_feature_sk actually exists?

What architectures are you building for? Paste the entire contents of your /proj.android/gradle.properties file.

EDIT:
I think I know what is going on. You may already be creating your builds with CMake, so your Android.mk file isn’t actually being used, meaning your 3 firebase libraries are not being created. The problem is that you didn’t add the relevant section of code in CMake to create your 3 libraries:

firebase_app_sk
firebase_feature_sk
firebase_analytics_sk

Try this:

# Make sure this path is correct, so check it yourself and adjust if needed
set(FIREBASE_CPP_SDK_DIR  ${CMAKE_CURRENT_SOURCE_DIR}/firebase_cpp_sdk)

# Not entirely sure if 'c++' is the correct STL to use, but the other options in the folder are gnustl and stlport
set(FIREBASE_LIBRARY_PATH $(FIREBASE_CPP_SDK_DIR)/libs/android/$(ANDROID_ABI)/c++)

add_library(firebase_app_sk STATIC IMPORTED)
set_target_properties(firebase_app_sk PROPERTIES IMPORTED_LOCATION ${FIREBASE_LIBRARY_PATH}/libfirebase_app.a)

add_library(firebase_feature_sk STATIC IMPORTED)
set_target_properties(firebase_feature_sk PROPERTIES IMPORTED_LOCATION ${FIREBASE_LIBRARY_PATH}/libfirebase_admob.a)

add_library(firebase_analytics_sk STATIC IMPORTED)
set_target_properties(firebase_analytics_sk PROPERTIES IMPORTED_LOCATION ${FIREBASE_LIBRARY_PATH}/libfirebase_analytics.a)

I’m not sure if you need the “IMPORTED” target property, but you can try it out I guess. More info here Imported Libraries

Also, you could just link directly to the app:

target_link_libraries(${APP_NAME} ${FIREBASE_LIBRARY_PATH}/libfirebase_app.a)
target_link_libraries(${APP_NAME} ${FIREBASE_LIBRARY_PATH}/libfirebase_admob.a)
target_link_libraries(${APP_NAME} ${FIREBASE_LIBRARY_PATH}/libfirebase_analytics.a)

Thank you so much.
I can solve my link problem with monkey-patching: -l…/dir/to/lib.a and link target call with it.

I’ll follow your instructions, and let you know about my status.

Thank you again.

I firstly check my cocos-cli version with

cocos -v
>cocos2d-x-3.17.1
>Cocos Console 2.3

My second intent is to apply your solutions to my project. I simply create a new project template with cocos-cli. After that, I migrate my source and header files, resources. Integrate Firebase Android integration instructing in this: [https://firebase.google.com/docs/admob/cpp/cocos2d-x](http://Firebase Cocos2d-x Integration)

I hope, this post and @R101’s answers help anyone who suffer like me.

@R101, my problem is still available for release version of my project.
Can you show me an example with no code, no implementation, just header includes and linking binaries.

PS: my code works with specific android-level and abi. But It doesn’t show the ad. It crashes.

I don’t understand what you mean by that. Do you mean that it works if you build debug? There should be no difference between the two.

Once again, I don’t understand what it is you’re asking for. If you mean CMake related items, then I don’t know how to help more than I already have, and I’ve already pointed you in the right direction. I highly doubt your issues are specific to Cocos2d-x, so search online for more info on CMake, and read the available documentation on the CMake website.

That’s not something I can help you with. I’ve never used Firebase, so if you’re getting no ads and crashes, that’s something you really should be figuring out yourself. You can’t be the only person who’s having these issues, so do a net search to find more info, or go through the Firebase docs more thoroughly.