cocos2d-x 2.0.1에서 2.1.0으로 Android Migration
지난 포스팅에서 cocos2d-x Win32버전을 마이그레이션 해봤습니다. 이번에는 안드로이드 버젼 마이그레이션 하면서 나온 이슈를 정리해봅니다.
역시나 본격적으로 정리에 앞서, 관심있으신 분들은 계속 읽어나가시면 되고 아니라면 그냥 새로운 프로젝트 진행할 때 cocos2d-x 업그레이드 하시는게 정신 건강에 좋다는 걸 염두해두시기 바랍니다.
Android.mk 파일 수정
proj.android\jni\Android.mk를 수정합니다.
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
$(call import-module,extensions)
위 2줄을 적절한 위치에 추가합니다. 추가적으로 제 경우는 Framework의 Android.mk 파일에서 $(LOCAL_PATH)/../cocos2d-2.0-rc2-x-2.0.1/cocos2dx \ 이런것이 있었는데 모두 cocos2d-x 최신버전 디렉터리에 맞게 수정했습니다.
NDK 컴파일 에러들
먼저 단순히 cygwin에서 sh build_native.sh를 했을 때,
위와 로그가 나왔습니다. 이는 cocos2d-x 버전업에 따른 COCOS2DX_ROOT 패스명이 바껴서 그렇습니다. build_native.sh를 열어 COCOS2DX_ROOT 패스에서 cocos2d-x 디렉터리 명을 수정합니다. 저는 아래와 같이 수정했습니다.
COCOS2DX_ROOT=/cygdrive/d/Program/trunk/Engine/cocos2d-2.1beta3-x-2.1.0
main.cpp에서 using namespace cocos2d::extension; 를 삭제합니다.
기존에 cocos2d-x가 컴파일 된게 구버전이라 그렇습니다. obj/local/armeabi/ 하위에 있는 cocos2dx_static, cocosdenshion_static 디렉터리를 모두 삭제 후 cocos2d-x를 다시 빌드합니다.
LOCAL_C_INCLUDES에 $(LOCAL_PATH)/../cocos2d-2.1beta3-x-2.1.0/extensions 를 추가합니다.
CCNotificationCenter가 위치가 Extensions에 있었는데 cocos2d-x로 기본 포함 되었네요. 기존에 #include "extensions/CCNotificationCenter/CCNotificationCenter.h" 이렇게 했었는데 #include "support/CCNotificationCenter.h" 로 수정했습니다.
LOCAL_STATIC_LIBRARIES := curl_static_prebuilt 이렇게 했었는데 LOCAL_STATIC_LIBRARIES := cocos_curl_static 이걸로 변경합니다.
이렇게해서 안드로이드 마이그레이션 정리를 마무리해봅니다. 자바쪽은 컴파일이 잘되네요. 물론 실행은 안해봤습니다. 어짜피 Win32 할 때도 코코스빌더쪽 좌표 이슈도 있었죠.
역시나 본격적으로 정리에 앞서, 관심있으신 분들은 계속 읽어나가시면 되고 아니라면 그냥 새로운 프로젝트 진행할 때 cocos2d-x 업그레이드 하시는게 정신 건강에 좋다는 걸 염두해두시기 바랍니다.
Android.mk 파일 수정
proj.android\jni\Android.mk를 수정합니다.
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
$(call import-module,extensions)
위 2줄을 적절한 위치에 추가합니다. 추가적으로 제 경우는 Framework의 Android.mk 파일에서 $(LOCAL_PATH)/../cocos2d-2.0-rc2-x-2.0.1/cocos2dx \ 이런것이 있었는데 모두 cocos2d-x 최신버전 디렉터리에 맞게 수정했습니다.
NDK 컴파일 에러들
먼저 단순히 cygwin에서 sh build_native.sh를 했을 때,
- Android NDK: WARNING: Ignoring unknown import directory: /cygdrive/d/Program/trunk/Engine/cocos2d-2.0-rc2-x-2.0.1
- Android NDK: WARNING: Ignoring unknown import directory: /cygdrive/d/Program/trunk/Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx/platform/third_party/android/prebuilt
- Android NDK: jni/Android.mk: Cannot find module with tag 'cocos2dx' in import path
- Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?
- Android NDK: The following directories were searched:
- Android NDK:make: Entering directory `/cygdrive/d/Program/trunk/Projects/MyGame/proj.android'
- jni/Android.mk:41: *** Android NDK: Aborting. . 멈춤.
- make: Leaving directory `/cygdrive/d/Program/trunk/Projects/MyGame/proj.android'
위와 로그가 나왔습니다. 이는 cocos2d-x 버전업에 따른 COCOS2DX_ROOT 패스명이 바껴서 그렇습니다. build_native.sh를 열어 COCOS2DX_ROOT 패스에서 cocos2d-x 디렉터리 명을 수정합니다. 저는 아래와 같이 수정했습니다.
COCOS2DX_ROOT=/cygdrive/d/Program/trunk/Engine/cocos2d-2.1beta3-x-2.1.0
- jni/helloworld/main.cpp:13:26: error: 'extension' is not a namespace-name
- jni/helloworld/main.cpp:13:35: error: expected namespace-name before ';' token
main.cpp에서 using namespace cocos2d::extension; 를 삭제합니다.
- jni/helloworld/main.cpp:29:56: error: lvalue required as unary '&' operand
CCEGLView *view = &CCEGLView::sharedOpenGLView(); 에서 &를 뺍니다.
view->setDesignResolutionSize(960, 640); 이 놈이 문제인데 마이그레이션 하면서 크로스플랫폼하게 AppDelegate.cpp로 이동되었으므로 삭제합니다.
- jni/helloworld/main.cpp:33:47: error: no matching function for call to 'cocos2d::CCEGLView::setDesignResolutionSize(int, int)'
- jni/helloworld/main.cpp:33:47: note: candidate is:
- D:/Program/trunk/Engine/cocos2d-2.1beta3-x-2.1.0/cocos2dx/platform/CCEGLViewProtocol.h:81:18: note: virtual void cocos2d::CCEGLViewProtocol::setDesignResolutionSize(float, float, ResolutionPolicy)
- D:/Program/trunk/Engine/cocos2d-2.1beta3-x-2.1.0/cocos2dx/platform/CCEGLViewProtocol.h:81:18: note: candidate expects 3 arguments, 2 provided
view->setDesignResolutionSize(960, 640); 이 놈이 문제인데 마이그레이션 하면서 크로스플랫폼하게 AppDelegate.cpp로 이동되었으므로 삭제합니다.
- jni/helloworld/main.cpp:36:44: error: request for member 'run' in 'cocos2d::CCApplication::sharedApplication()', which is of non-class type 'cocos2d::CCApplication*'
CCApplication::sharedApplication().run(); 에서 .을 ->로 변경합니다.
- make: *** `obj/local/armeabi/objs-debug/cocos2dx_static/CCConfiguration.o'에서 필요로 하는 타겟 `/cygdrive/d/Program/trunk/Engine/cocos2d-2.0-rc2-x-2.0.1/cocos2dx/CCConfiguration.cpp'를 만들 규칙이 없습니다. 멈춤.
기존에 cocos2d-x가 컴파일 된게 구버전이라 그렇습니다. obj/local/armeabi/ 하위에 있는 cocos2dx_static, cocosdenshion_static 디렉터리를 모두 삭제 후 cocos2d-x를 다시 빌드합니다.
- fatal error: CCBReader/CCNodeLoader.h: No such file or directory
LOCAL_C_INCLUDES에 $(LOCAL_PATH)/../cocos2d-2.1beta3-x-2.1.0/extensions 를 추가합니다.
- fatal error: extensions/CCNotificationCenter/CCNotificationCenter.h: No such file or directory
CCNotificationCenter가 위치가 Extensions에 있었는데 cocos2d-x로 기본 포함 되었네요. 기존에 #include "extensions/CCNotificationCenter/CCNotificationCenter.h" 이렇게 했었는데 #include "support/CCNotificationCenter.h" 로 수정했습니다.
- fatal error: curl/curl.h: No such file or directory
작년에 한참 libcurl 볼때는 링크에 있는데로 수정했었는데 이번에는 다르더군요. platform/third_party/android/prebuilt/libcurl/Android.mk 가 이름이 변경 되었더군요.
LOCAL_STATIC_LIBRARIES := curl_static_prebuilt 이렇게 했었는데 LOCAL_STATIC_LIBRARIES := cocos_curl_static 이걸로 변경합니다.
이렇게해서 안드로이드 마이그레이션 정리를 마무리해봅니다. 자바쪽은 컴파일이 잘되네요. 물론 실행은 안해봤습니다. 어짜피 Win32 할 때도 코코스빌더쪽 좌표 이슈도 있었죠.
안녕하세요! cocos2d-x 관련 포스트 정말 많은 도움이 되고 있어요 ~ 너무 감사드려요. 다름이 아니라 질문드릴게 있어서요 메일로 드릴려고 했는데 메일주소를 찾을 수가 없어서 이렇게 댓글로 남기게 되었습니다. cocos2d-x 엔진으로 프로젝트를 진행중인데 리소스 로딩도중에 애니메이션을 보여주고 싶은데 쓰레드를 돌려야 할거 같은데 cocos2d-x에서 사용가능한 pthread에서는 cocos2d api를 사용하지 말라는 권고를 하네요 curl포스트에서 fake thread라는 걸 언급하셨는데 무엇인지 궁금합니다. 혹시 방법이 있으시다면 알려주시면 감사하겠습니다 (__)
답글삭제안녕하세요~ 찾아주셔서 감사합니다 ^^
삭제cocos2d-x 레퍼런스 카운팅이나 기타 Array 같은 자료구조 등등이 쓰레드 세이프하지 못해서 이런 이슈가 있네요.
음.. 저희도 그 리소스 로딩중 애니 처리 때문에 제가 임시 땜빵으로 처리한 것이었는데요, 말 그대로 fake라.. 쓰레드 처리는 아닙니다. 쉽게 제가 만든 그 페이크 쓰레드 api를 다른 개발자가 사용하는데 있어서 매 루프마다 호출시 총 패치 파일중 하나씩 패치가 이루어지는 식으로 해서 패치시스템이 쓰레드 다 잡고 있지 않게해서 ui 갱신이 가능하게 했던거죠. 이건 도움이 안될듯 하구요.
http://struggle.tistory.com/436
이분 링크를 아시려는지 모르겠지만 참고해보세요. 또한 최신 버전의 cocos2d-x extensions에 있는 HttpClient.cpp에도 답이 있는듯 합니다. 이것도 참고하면 좋겠네요.
답변 감사합니다!! ^^ 적용해봐야겠네요
삭제저도 쓰레드나 네트워크쪽은 약해서... ㅋ; 주말 늦은시간인데 설마 회사신건? ㅎㅎ;; 고생하시구요~
삭제