구글애드-가로긴거2



Windows 에서 Android Froyo(2.2) NDK 를 이용한 Native Application 빌드 방법 ㄴJNI




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 를 이용하여 컴파일된 파일을 실행하시면 다음과 같은 결과를 얻으실 수 있습니다.


저작자 표시 비영리 변경 금지

덧글

  • 2010/11/08 11:24 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 카루딘 2010/11/08 11:29 #

    cygwin의 경우, 저는 ndk-build 사용하여 안드로이드에서 정식 지원하는 JNI 룰을 따라 make 파일 생성해서 사용했는데요.
    혹 다른 toolchain 사용하여 컴파일 하시는 것은 cygwin 경로 용법대로 /cygdrive/드라이브/패스/ 정도로 하시면 될거같아요.
    위 방법은 기존 MinGW 유저나 리눅스 잘 다루시는 분들이 사용하시기 좋은거 같습니다.
  • 카루딘 2010/11/20 14:33 # 답글

댓글 입력 영역


DNSErver

DNS server, DNS service

구글애드-세로


정사각디스플레이

통계 위젯 (화이트)

62330
1320
697886

구글애드3