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를 수정 또는 추가합니다.
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 광로를 연동할 수 있습니다.
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를 수정 또는 추가합니다.
- def build(): 에서 current_dir 밑에 아래 내용을 추가 및 수정
- plugin_root = os.path.join(current_dir, "../../../plugin") # Add
- do_build(plugin_root, cocos_root, ndk_root, app_android_root) # Modify
- def do_build 함수도 아래와 같이 수정 추가
- def do_build(plugin_root, cocos_root, ndk_root, app_android_root): # Modify
- 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 광로를 연동할 수 있습니다.
댓글
댓글 쓰기