Added Google Play Games with SDKBox, but my project can't see the headers

I’m working with Cocos2d-x 3.17.1 in Android Studio 3.3.1 using SDKBox GUI 1.1.7.

My compilation error says:

../../../../jni/PluginSdkboxPlay/..\PluginGPG/PluginGPG.h:18:10: fatal error: 'gpg/gpg.h' file not found

I can get PluginGPG.h to include gpg/gpg.h if I give it the full path from the jni folder:

#include<gpg/include/gpg/gpg.h>

But to go that route would mean making the same change in every GPG header, and modifying GPG doesn’t seem right.

I can see all the GPG files in the project explorer, but when I open one, Android Studio says:

This file does not belong to any project target, code insight features might not work properly.

Here is my Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := MyGame_shared

LOCAL_MODULE_FILENAME := libMyGame

LOCAL_SRC_FILES := $(LOCAL_PATH)/hellocpp/main.cpp \
$(LOCAL_PATH)/../../../Classes/AppDelegate.cpp \
$(LOCAL_PATH)/../../../Classes/HelloWorldScene.cpp \
$(LOCAL_PATH)/../../../Classes/PluginGPGCppHelper.cpp

LOCAL_CPPFLAGS := -DSDKBOX_ENABLED \
-DSDKBOX_COCOS_CREATOR
LOCAL_LDLIBS := -landroid \
-llog

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes
LOCAL_C_INCLUDES += $(LOCAL_PATH)/gpg/include

# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END

LOCAL_WHOLE_STATIC_LIBRARIES += PluginGPG
LOCAL_WHOLE_STATIC_LIBRARIES += PluginSdkboxPlay
LOCAL_WHOLE_STATIC_LIBRARIES += sdkbox
LOCAL_WHOLE_STATIC_LIBRARIES += gpg-1

LOCAL_STATIC_LIBRARIES := cc_static

# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END

include $(BUILD_SHARED_LIBRARY)
$(call import-add-path,$(LOCAL_PATH))

$(call import-module, cocos)
$(call import-module, ./sdkbox)
$(call import-module, ./Plugingpg)
$(call import-module, ./gpg)
$(call import-module, ./PluginSdkboxPlay)

# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END

I’ve tried several ways of rewriting this part, which should all by functionally equivalent, but none of them work:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes
LOCAL_C_INCLUDES += $(LOCAL_PATH)/gpg/include

Here’s how it originally was:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes \
./gpg/include

For good measure, here’s my 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 Chetris)

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)

# 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
    Classes/HelloWorldScene.cpp
    )
list(APPEND GAME_HEADER
    Classes/AppDelegate.h
    Classes/HelloWorldScene.h
    )

if(ANDROID)
   # change APP_NAME to the share library name for Android, it's value depend on AndroidManifest.xml
   set(APP_NAME MyGame)
   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)
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")
   endif()
elseif(WINDOWS)
   cocos_copy_target_dll(${APP_NAME} COPY_TO ${APP_RES_DIR}/..)
endif()

if(LINUX OR WINDOWS)
   cocos_copy_res(COPY_TO ${APP_RES_DIR} FOLDERS ${GAME_RES_FOLDER})
endif()
# PluginSdkboxPlay
if(ANDROID)
   add_definitions(-DSDKBOX_ENABLED)
   add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/proj.android/app/jni/PluginSdkboxPlay/)
   target_link_libraries(${APP_NAME} ext_PluginSdkboxPlay)
endif()
# sdkbox
if(ANDROID)
   add_definitions(-DSDKBOX_ENABLED)
   add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/proj.android/app/jni/sdkbox/)
   target_link_libraries(${APP_NAME} ext_sdkbox)
endif()

Ideas?

plz set PROP_BUILD_TYPE=ndk-build with proj.android/gradle.properties file.

You either use CMake or ndk-build (which uses *.mk files), not both. If you are using CMake, then the reason it’s not working is that you forgot to add the following to the CMakeLists.txt:

  • A reference to your /Classes/PluginGPGCppHelper.cpp or .h files.
  • A reference to the gpg library, the gpg library header path etc.

There are plenty of examples within the CMakeLists.txt file to how you how to include both the paths and the library.

The alternative is to stick with ndk-build, which uses the *.mk files, as yinjimmy suggested.

Thank you so much, you’re a life saver.