게임 개발/Cocos2d-x

Android NDK r9c 에서, std::to_string () 지원 안돼요~

날개 2014. 1. 13. 21:37

Cocos2d-x 작업과 뗄레야 뗄 수 없는 NDK 빌드...


안드로이드는 기본 어플리케이션 프레임웍이 자바로 되어 있으니, C++을 사용하려면 NDK를 사용할 수 밖에 없죠.


당연히 Cocos2d-x도 안드로이드용으로 빌드하기 위해서는 NDK를 사용합니다.


Cocos2d-x 3.0부터 본격적으로(?) C++11을 사용하기 때문에, std::to_string () 역시 당연히 될것이라고 생각했습니다.


iOS용 빌드를 먼저하기 때문에, XCode에서도 물론 빌드도 잘 되고, 실행도 잘 되었습니다.


그러나, 잘 되겠지라고 생각한 NDK를 통한 빌드의 결과는?


...

...


jni/../../Classes/Game/AAAScene.cpp:204:26: error: 'to_string' is not a member of 'std'

...

...


에러.... std에 to_string 같은건 없답니다. --;


참고로 NDK 버전은 r9c 입니다. 지금 글을 쓰는 시점에서 최신 버전이지요.


'아니 표준인데 왜 없어? 뭔가 잘못된거야'라는 생각과 함께 구글링 시작....


그러나... 구글에서 찾은 결과도, '버그야', '안드로이드에서는 안되더라' 뭐 이런류의 답들과 해결책이라고는 나만의 to_string 을 직접 만들어 쓰라는 내용들이더군요. --


그래서, 만들어 봅시다. to_string 함수를...


std::to_string 함수는 그냥 인수로 들어오는 int형의 정수 값을 std::string 형으로 바꾸어주는겁니다. 네, 그게 끝입니다.


이 함수가 없으니까 그냥 스트링의 스트림으로 만들어 줍니다.


std::string MyUtil::IntToString (int number)

{

std::ostringstream convStream;

convStream << number;

return convStream.str ();

}


이게 다입니다. 간단하죠? 그런데 이 간단한게 왜 없는지...


참고로, 저는 제 유틸리티 클래스에 스태틱멤버로 저 함수를 만들었는데요, 취향에 맞게 함수이름을 만들면 되겠죠. 굳이 멤버함수로 만들지 않아도 되고요.


다만, 개인적으로는 to_string 이라는 이름은 사용하지 않기를 추천합니다. 왜냐면, cocos2d-x와 같이 멀티 플랫폼을 위한 개발을 한다면, 해당 환경의 컴파일러에따라 to_string이 있어서 이름의 충돌이 일어날 수도 있기 때문이죠. (std::to_string 이런식으로 쓰시는 분은 문제 없을 수 있어도, using namespace std; 사용하는 분들은 충돌납니다.)


참고로, 미리 만들어둔 소스코드의 std::to_string을 새로 만든 함수로 바꾸기위해 전체 검색을 했더니, cocos2d-x 엔진 소스쪽에서 이런게 검출 되더군요.


// std::to_string is not supported on android, using std::stringstream instead.

    std::stringstream ss;

    ss << size;

    return  tempName.append(ss.str());


네...그렇습니다. cocos2d-x 개발자도 '안드로이드에서는 std::to_string이 지원 안되니까 std::stringstream을 대신 쓴다'고 적어놨네요. 그 밑에는 그렇게 구현 했고요... CCFontAtlasCache.cpp에서 찾아낸 내용입니다. 사실상, 위에 적어놓은 소스와 동일한 내용이라고 보면 되겠습니다.


혹시 정상적으로 std::to_string 사용에 성공하신분 있으시면 알려 주세요. ^^;





끝.