Cocos2d-x Plugin-X 적용 후 NDK 빌드 시 이슈들

 Cocos2d-x 플러그인 시스템을 프로젝트에 적용 후 build_native.py로 NDK 빌드 중 몇가지 이슈가 있었습니다. 익숙한 것도 있고 아닌것도 있네요.


1. fatal error: PluginJniHelper.h: No such file or directory

[armeabi] Compile++ thumb: cocos2dcpp_shared <= main.cpp
jni/hellocpp/main.cpp:8:29: fatal error: PluginJniHelper.h: No such file or directory
 #include "PluginJniHelper.h"
                             ^
compilation terminated.
make.exe: *** [obj/local/armeabi/objs/cocos2dcpp_shared/hellocpp/main.o] Error 1

make.exe: Leaving directory `D:/cocos2d-x-3.0alpha1/projects/AdMobTestGame/proj.
android'


 뭐 ndk 빌드시 많이 봐왔던 에러죠. 진행중인 프로젝트의 Android.mk에 아래와 같은 것을 추가해주면 되죠.

LOCAL_WHOLE_STATIC_LIBRARIES += PluginProtocolStatic

$(call import-module,protocols/android)


2. Cannot find module with tag 'protocols/android' in import path

 하지만 다시 빌드해보면 오랜만에 NDK_MODULE_PATH 관련 오류를 볼 수 있습니다. 3.x 버전오면서 NDK_ROOT만 해주면 나머지 환경변수에 대한 이슈는 별로 없었는데 플러그인 작업을 진행하니 또 발생하네요.

Android NDK: D:\cocos2d-x-3.0alpha1\projects\AdMobTestGame\proj.android\../../..
/external/Box2D/Android.mk: Cannot find module with tag 'protocols/android' in i
mport path
Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?

Android NDK: The following directories were searched:
Android NDK:
make.exe: Entering directory `D:/cocos2d-x-3.0alpha1/projects/AdMobTestGame/proj
.android'
jni/Android.mk:26: *** Android NDK: Aborting.    .  Stop.
make.exe: Leaving directory `D:/cocos2d-x-3.0alpha1/projects/AdMobTestGame/proj.
android'


 아래와 같이 build_native.py를 수정 또는 추가합니다.

  1. def build(): 에서 current_dir 밑에 아래 내용을 추가 및 수정
    1. plugin_root = os.path.join(current_dir, "../../../plugin") # Add
    2. do_build(plugin_root, cocos_root, ndk_root, app_android_root) # Modify
  2. def do_build 함수도 아래와 같이 수정 추가
    1. def do_build(plugin_root, cocos_root, ndk_root, app_android_root): # Modify
    2. platform = sys.platform 밑에 내용을 아래 내용으로 수정
if platform == 'win32':
        #ndk_module_path = 'NDK_MODULE_PATH=%s;%s/external;%s/cocos' % (cocos_root, cocos_root, cocos_root)
        ndk_module_path = 'NDK_MODULE_PATH=%s/publish;%s;%s/external;%s/cocos' % (plugin_root, cocos_root, cocos_root, cocos_root)
    else:
        #ndk_module_path = 'NDK_MODULE_PATH=%s:%s/external:%s/cocos' % (cocos_root, cocos_root, cocos_root)
        ndk_module_path = 'NDK_MODULE_PATH=%s/publish:%s:%s/external:%s/cocos' % (plugin_root, cocos_root, cocos_root, cocos_root)



3. error: invalid use of incomplete type 'struct android_app'

[armeabi] Compile++ thumb: cocos2dcpp_shared <= main.cpp
jni/hellocpp/main.cpp: In function 'void cocos_android_app_init(android_app*)':
jni/hellocpp/main.cpp:19:35: error: invalid use of incomplete type 'struct android_app'
     PluginJniHelper::setJavaVM(app->activity->vm);
                                   ^
jni/hellocpp/main.cpp:15:37: error: forward declaration of 'struct android_app'
 void cocos_android_app_init (struct android_app* app) {
                                     ^
make.exe: *** [obj/local/armeabi/objs/cocos2dcpp_shared/hellocpp/main.o] Error 1

make.exe: Leaving directory `D:/cocos2d-x-3.0alpha1/projects/AdMobTestGame/proj.android'


jni/hellocpp/main.cpp 에 플러그인 사용을 위해 아래 내용을 추가해 빌드 중 발생했습니다.

// for plugins
#include "PluginJniHelper.h"
#include "PluginUtils.h"

void cocos_android_app_init (struct android_app* app) {
    LOGD("cocos_android_app_init");
    AppDelegate *pAppDelegate = new AppDelegate();
    // for plugins
    PluginJniHelper::setJavaVM(app->activity->vm);
    PluginJniHelper::setClassLoaderFrom(app->activity->clazz);
    plugin::PluginUtils::initPluginWrapper(app);
}

 기본 소스는 안드로이드 nativeactivity와 관련된 android_app 구조체를 사용을 안해서 괜찮았지만 이걸 사용하다보니 아래의 h 파일을 추가로 인클루드 해줘야 해결이 됩니다.

#include <android_native_app_glue.h>


 이제 C++딴 AdMob 관련 코드를 추가 후 NDK를 빌드하고 자바 소스는 하나도 건들 것없이 구글 AdMob 광로를 연동할 수 있습니다.

이 블로그의 인기 게시물

CMake Windows에 설치하기

Unity3D 안드로이드 Keystore 생성하기

Unity3D iOS Plugin 만들어 연동하기