블로그 이미지
HISONA

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31




Android 에서 디바이스 드라이버를 테스트 한다거나, 리눅스 라이브러리를 빌드하는 것과 같은, 여러가지 이유로 간단하게 C 로 작성된 테스트 어플 및 Dynamic Linkage 라이브러리와 같은 Android C Native Application 을 개발하기 위해서 해야 할 일들을 정리해 보았습니다.
다들 아시겠지만, Android 에서는 BSD 계열의 Bionic-C 의 라이브러리를 사용하고 있습니다. 그래서 GNU Toolchain 을 사용해서 작업하려면 Static 으로 빌드를 해야 하지만, 바이너리 사이즈가 커지는 단점이 있습니다. 여기에서는 Android NDK 에 포함된 bionic-C 라이브러리를 사용해서 Native 바이너리를 생성하는 방법을 설명합니다.
그리고, 여기에서는 Windows 에서 작업하는 것을 기준으로 설명합니다. 이유는 리눅스에서 작업하기 위해서는 별도의 PC나 Vmware 와 같은 프로그램이 필요하고, Windows 에서 개발하는 것이 더 편리하기 때문입니다. 또한, Windows 에서 작업하는 방법을 안다면, 리눅스에서 개발하시던 분은 리눅스에서도 동일하게 작업이 가능하실 것으로 생각됩니다.

1. Andorid NDK 설치

- 먼저 http://dl.google.com/android/ndk/android-ndk-r4b-windows.zip 에서 Android NDK 를 다운로드 받습니다.  
- 적당한 위치에 android-ndk-r4b-windows.zip 파일의 압축을 풀면 됩니다.
- 저는, “D:\android-ndk-r4b” 에 설치하였습니다.

2. MinGW, Msys 설치

- Android 개발 환경이 Linux 기반으로 되어 있기 때문에, Windows 에서 리눅스 개발 환경을 제공해 주는 것입니다. MinGW 와 Msys 에 대해서는 이전 포스트의 설치 방법을 참조하시면 될 것 같습니다(http://ohadev.tistory.com/6)
- Android NDK 에서는 Cygwin(MinGW 와 같이 Linux 개발 환경을 제공) 을 사용해서 컴파일 하도록 하고 있으나, 개인적으로 MinGW 를 더 선호하기 때문에 MinGW 를 기준으로 설명합니다. Cygwin 을 사용하시는 분들은 Cygwin 을 사용하셔서 진행하셔도 됩니다.

3. Arm Cross-compiler Toolchain 설치

- CodeSourcery 에서 Windows 설치용 Arm-Linux Toolchain  을 다운로드 해서 설치합니다.
(http://www.codesourcery.com/sgpp/lite/arm/portal/package6491/public/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi.exe)
- 저는, “D:\Android\arm-2010q1” 에 설치하였습니다.
- CodeSourcery Toolchain 은 Cygwin 용 dll 을 사용하지 않기 때문에, Cygwin 을 설치하지 않으셔도 컴파일을 하실 수 있습니다. (제가 MinGW 를 사용하는 이유가 MinGW 로 Windows Application 을 만들면 Cygwin 과 같이 별도의 dll 을 포함 시키지 않아도 되기 때문입니다.)
- Cygwin 을 사용하면 Android NDK 에 포함되어 있는 Toolchain (android-ndk-r4b\build\prebuilt\windows\arm-eabi-4.4.0) 을 사용해서 컴파일할 수 있을 것 같은데 저는 잘 안되는군요.

4. Makefile 작성

예제파일 : 


- 본 문서를 작성하기 위해서 http://dustinlee.egloos.com/1973505 를 참고하였습니다.
- Makefile 에서 주의하실 점은, Android NDK 에 포함되어 있는 Bionic-C 라이브러리를 사용하기 위해서, GNU 에 포함된 라이브러리를 사용하지 않도록, “-nostdlib”  Link 옵션을 주셔야 합니다.
- 또한, LDFLAGS 에서 dynamic-linker 를 지정할 때 그냥 path 를 “/system/bin/linker” 를 지정하면 msys 에서 상대 Path로 인식해서 앞에 D:/MinGW/msys/ 를 자동으로 붙여버리기 때문에, 절대 경로를 지정하기 위해서 “//system/bin/linker” 로 지정하셔야 합니다.
- 예제에서 사용한 Makefile 은 다음과 같습니다.

TARGET = hello

CROSS  = /d/Android/arm-2010q1/bin/arm-none-linux-gnueabi-
INCDIR = /d/Android/android-ndk-r4b/build/platforms/android-8/arch-arm/usr/include
LIBDIR = /d/Android/android-ndk-r4b/build/platforms/android-8/arch-arm/usr/lib

CC  = $(CROSS)gcc
AR  = $(CROSS)ar
LD  = $(CROSS)ld
NM  = $(CROSS)nm
RANLIB  = $(CROSS)ranlib
STRIP = $(CROSS)strip

INCLUDE = -I. -I$(INCDIR)

CFLAGS = -Wall
LDFLAGS = -nostdlib -Wl,--dynamic-linker,"//system/bin/linker" -L$(LIBDIR) -lc -lm -lstdc++ -ldl

# crt
CRTOBJ = $(LIBDIR)/crtbegin_dynamic.o

# application file
APPSOURCES = main.c
APPOBJS = $(APPSOURCES:.c=.o)

# define the rule
.SUFFIXES:.c .o
.c.o:
@echo Compiling: $<
$(CC) -c $(CFLAGS)  $(INCLUDE) -o $@ $<

all: app

app: $(APPOBJS)
@echo Linking: $(TARGET)
$(CC) -o $(TARGET) $(APPOBJS) $(CRTOBJ) $(LDFLAGS)
$(STRIP) -s $(TARGET)

clean:
@rm -vf $(APPOBJS) $(TARGET)

5. 실행

- Android emulator 를 실행한 다음, adb 를 이용하여 컴파일된 파일을 실행하시면 다음과 같은 결과를 얻으실 수 있습니다.


이전 1 다음