Android 1.5 NDK Release 1
안드로이드 블로그에서 갑자기 날아든 소식. NDK 가 나왔습니다. http://android-developers.blogspot.com/2009/06/introducing-android-15-ndk-release-1.html NDK 는 독립 형 C 응용을 제작하기 위한 것은 아니고, Dalvik VM 용 응용에서 JNI 를 통해 사용할 수 있는 공유라이브러리를 제작하기 위한 도구입니다.(플랫폼 빌더를 위한 도구는 더더욱 아닙니다.) 때문에 NDK 는 ARMv5TE 타깃을 위한 크로스 툴 체인(gcc 4.2.1)과 헤더및 공유라이브러리들을 포함하고 있을 뿐만 아니라, 안드로이드 SDK 와 연결하기 위한 빌드 환경을 제공합니다. 빌드 환경이라고 해서 대단한 내용은 아니고, 여러 개의 공유 라이브러리를 사용하는 안드로이드 응용을 위한 make 파일과 디렉터리 구조를 제공한다는 뜻입니다. 빌드하면 지정한 디렉터리에 공유 라이브러리들이 만들어지는 형태이고, 이후 apk 패키징은 안드로이드 SDK 에서 하던 대로 하면 됩니다. NDK 호스트 환경은 Windows, Mac OS X, Linux 를 지원하고 있습니다. 약간 실망스럽지만 Windows 환경은 Cygwin 을 사용해야 합니다. Windows 용 NDK 를 설치해서 샘플을 빌드 하는 과정은 순조롭게 이루어집니다. 다만 대소문자만 차이 나는 파일이 6쌍이 존재하네요. 일단 무시합니다만 파일의 내용이 다르기 때문에 조심할 필요가 있을듯합니다. 나중에 다시 살펴보기로 하고 일단은 파일 목록만 적어둡니다. build/platforms/android-1.5/common/include/linux/netfilter_ipv6/ip6t_hl.h build/platforms/android-1.5/common/include/linux/netfilter/xt_mark.h build/platforms/android-1.5/common/include/linux/netfilter/xt_connmark.h build/platforms/android-1.5/arch-arm/usr/include/linux/netfilter_ipv6/ip6t_hl.h build/platforms/android-1.5/arch-arm/usr/include/linux/netfilter/xt_mark.h build/platforms/android-1.5/arch-arm/usr/include/linux/netfilter/xt_connmark.h 이 목록에서 눈치 채셨겠지만 arch-x86 은 아직 NDK 에 포함되지 않고 있습니다. NDK 의 배포는 공유 라이브러리를 응용에 함께 배포하는 표준적인 방법을 제공한다는 실용적인 목적 외에도 플랫폼의 경계를 좀 더 분명히 정의해 주기도 합니다. 무슨 뜻인고 하니 안드로이드 SDK 가 제공하는 Dalvik 인터페이스들 외에, 안드로이드 1.5 런타임에 포함된 각종 시스템 라이브러리들에 대한 표준화가 시작되었다고 받아들일 수 있다는 뜻입니다. NDK 에 포함된 docs/STABLE-APIS.TXT 파일에는 표준화된 라이브러리와 헤더들이 언급되고 있습니다. 여기에서 구체적으로 언급하는 라이브러리들은 고작 5가지(libc, libm, libstdc++, liblog, libz) 입니다. 모두 관심 있을 OpenGL ES 나 Media 관련 라이브러리들은 포함되지 않았습니다. 앞으로 더 들어오겠지요? 아마도 기다리느니 직접 준비하시는 분들도 있겠지요? 라이브러리들과 헤더들의 호환성 조사는 좀 한가해 질 때 합시다. 마지막으로 한가지 더. 안드로이드가 C++ 을 어디 까지 지원하고 있느냐 하는 것인데, 이번 NDK 를 통해 살펴보면
- 템플릿은 지원하는 것으로 보인다. 그렇다고 STL 라이브러리를 지원한다는 뜻은 아님.
- 예외(Exception) 와 RTTI 는 지원하지 않는다.
- 거의 대부분의 C++ 표준 라이브러리를 지원하지 않는다.
정리하면 최소한의 문법 요소들은 지원하고 있지만, 라이브러리가 필요한 기능들은 대부분 지원하지 않고 있다. 때문에 이런 문제를 해결하기 전에는 오픈소스 C++ 라이브러리들을 사용하는 것은 곤란하다고 보아야 한다. EC++ 보다도 제약이 큰 시스템이다. C++ 라이브러리는 대부분 만들어 쓰고 예외는 사용하지 않겠다고 결심하는 것이 좋을 듯. 피곤하기는 하지만 C++을 간절히 원한다면 못할 일은 아니지 않을까? 관련 포스트: