[android] NDK 개발환경 세팅
android 2013. 9. 9. 18:041. NDK란
앱을 개발할 때 보통은 SDK를 이용하여 개발을 한다. 그러나 SDK 에서 지원하지 않거나, 성능상의 이슈를 해결하기 위해서 NDK를 이용한다. NDK로 할 수 있는 것들은 어떤 것이 있을까를 알아보기 위해서 NDK에서 제공하는 것들을 알아보자.
· libc (C library) headers
· libm (math library) headers
· JNI interface headers
· libz (Zlib compression) headers
· liblog (Android logging) header
· OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
· libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
· A Minimal set of headers for C++ support
· OpenSL ES native audio libraries
· Android native application APIS
많구나~ ㅋㅋ. 근데 이걸로 멀 할 수 있을까? 현실적인 주요 목적은 기존에 작성된 c/c++ 코드로 구현된 코드를 (java로 처리가 느린 image processing 같은것이 좋은 예) 그대로 이식할 수 있게 된다. 물론 필요에 따라서 java 로직을 c/c++으로 개발 할 수도 있다.
2. NDK 설치하기
설치전 필요한것들 (자세한건 http://developer.android.com/tools/sdk/ndk/index.html#Reqs 참고 )
Android SDK : android 1.5 SDK 이상
지원하는 운영체제 : windows XP 이상, Mac OS X 10.4.8 이상 ( x86만 ), Linux ( GLibc 2.7 이상 )
필요한 개발도구 :
각 OS에 맞는 GNU Make 3.81 이상
최신 버전의 awk
윈도우의경우 Cygwin 1.7 이상
아래를 클릭해서 설치한다. ( 자신의 OS에 맞는 걸로 ) 나는 window 64bit를 받았다.
http://developer.android.com/tools/sdk/ndk/index.html
450MB 크기의 zip파일을 받아서 그냥 아무곳에 압축을 해제하면 된다. (해제하니 1GB 헐 ㅠㅠ)
3. Cygwin 설치 (윈도우에서)
다음으로 Windows 환경이므로 cygwin을 설치한다.
http://cygwin.com/install.html
여기서 setup.exe를 받아서 설치한다.
설치 중간에 package를 선택하는게 나오는데 아래는 꼭 선택해야 한다.
gcc-core : C compiler
gcc-g++ : C++ Compiler
make : The GNU version of the ‘make’ utility
(본인은 make를 선택안 했다가 나중에 구글링을 좀 했었다. )
그러면 dependency가 걸려 있는 다른 모듈들도 같이 설치된다. ( maven 처럼 좋네~ )
Cygwin을 실행한 후에 path를 설정하면 편하다.
vi .bashrc
export PATH=$PATH: {여기에 ndk-build경로 추가}
alias ll=’ls –all’
4. sample build test
Cywin을 실행한 뒤에 NDK의 sample 폴더로 이동한뒤에 hello-jni로 이동한다.
그러면 jni 폴더에 2개의 파일이 존재한다.
$ tree jni
jni
├── Android.mk
└── hello-jni.c
여기서 ndk-build를 실행하면 libhello-jni.so 파일이 생성된다. 생성후 /libs/armeabi/libhello-jni.so에 설치했다고 나온다.
$ ndk-build
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
참고로 .so 파일은 apache의 모듈로 자주 보던 형식이었는데 linux의 share object 파일으로 윈도우의 dll 과 비슷한 것으로 생각하면 된다. Linex의 static library는 .a 파일이고, shared-library가 .so 파일이므로 .so 로 빌드해야 한다. Android는 .so 파일만 로딩할 수 있다.