14 장타깃장치로고급포팅하기
시작하면서 2 목차 14.1 안드로이드에서 C 프로그램실행시키기 14.2 안드로이드 NDK 설치 14.3 NDK 기초실습 14.4 NDK 고급실습
14.1 C 프로그램실행시키기 3 안드로이드플랫폼에서애플리케이션 자바 C/C++ 자바애플리케이션과 C/C++ 프로그램과의상호연동 에뮬레이터에서 apk 패키지아닌 C/C++ 프로그램실행
14.1 C 프로그램실행시키기 4 [ 실습 14-1] C 로 helloworld.c 빌드, 실행 (1) vi helloworld.c 01 #include <stdio.h> 02 int main(int argc, char **argv) 03 { 04 printf("hello World! \n"); 05 return 0; 06 } (2) arm-none-linux-gnueabi-gcc -static helloworld.c -o helloworld 다음은실행파일을만들기위하여컴파일과정을짂행한다. gcc 를사용하여애플리케이션컴파일과빌드를한다. 정적 (static) 옵션을사용하여빌드를한다.
14.1 C 프로그램실행시키기 5 [ 실습 14-1] C 로 helloworld.c 빌드, 실행 (3) adb push helloworld data/helloworld 리눅스에서새로작성한애플리케이션실행파일 helloworld 을윈도우의에뮬레이터에서실행해볼수있도록에뮬레이터로복사한다. adb 를사용하여 에뮬레이터파일시스템의 data/helloworld 디렉토리로업로드한다. (4) adb shell 에뮬레이터쉘모드로갂다. (5) chmod 777 data/helloworld helloworld 프로그램에대한소유권한을실행가능상태로설정한다. (6)./helloworld 파일을실행시키기위하여./helloworld 를입력한다. 리눅스는실행파일에대한경로정보를현재디렉토리가포함하고있지않아서, 현재디렉토리를나타내는접두사./ 을붙여준다. 갂단하지만안드로이드에뮬레이터에서리눅스 C 프로그램이동작되는것을확인할수있다. (7) Hello World! 실행결과 Hello World! 가화면에나타나는것을확인한다.
14.1 C 프로그램실행시키기 6 [ 실습 14-2] C 로 hellodynamic.c 빌드, 실행 (1) < 실습 14-1> 처럼 hellodynamic.c 를작성한다. (2) 에뮬레이터 /system/lib 파일을 D:\android\system\lib 으로추출
14.1 C 프로그램실행시키기 7 [ 실습 14-2] C 로 hellodynamic.c 빌드, 실행 (3) arm-none-linux-gnueabi-gcc -c hellodynamic.c -o hellodynamic.o hellodynamic.c 를컴파일한다. -c 옵션으로컴파일만수행한다. (4) arm-none-linux-gnueabi-ld -entry=main -dynamic-linker /system/bin/linker -nostdlib -rpath /system/lib -rpath-link /android/system/lib -L /android/system/lib -I android_runtime -I c -o hellodynamic hellodynamic.o hellodynamic.c 프로그램에대한라이브러리를동적으로연결하여빌드하기 위하여 arm-none-linux-gnueabi-ld 를사용한다. (5) SDK \tools\adb push hellodynamic /data/ 리눅스서버에서동적으로빌드한 hellodynamic 파일을윈도우기반의 SDK \tools 디렉터리로복사한다.
14.1 C 프로그램실행시키기 8 [ 실습 14-2] C 로 hellodynamic.c 빌드, 실행 (6) # adb shell; # cd data; # ls -l 윈도우에서 adb 셸모드로들어갂후, 에뮬레이터 /data 디렉터리로이동한다. 파일목록을 ls -l 로검사한다. 2504 hellodynamic 568231 helloworld (7)./helloworld 실행결과로 Hello World! 를갖는다. (8)./hellodynamic 실행결과로 Hello World! [1] Killed./hellodynamic
14.2 안드로이드 NDK 설치 9 Java : JNI (Java Native Interface) 안드로이드 : NDK (Native Development Kit) Native method? 안드로이드에서사용할수있도록 C/C++ 로만들어짂라이브러리 안드로이드에서는 NDK 는 C/C++ 로작성된코드를공유라이브러리형태로만들어안드로이드애플리케이션이사용할수있도록하는역할 [ 그림 14-1] NDK 역할
14.2 안드로이드 NDK 설치 10 NDK 는 C/C++ 로개발된코드를네이티브라이브러리형태로만들어 Java 에서사용할수있도록해주는도구와빌드파일을포함 네이티브 API 를위하여다음과같은헤더파일을제공한다. libc(c 라이브러리 ) 헤더 libm(math 라이브러리 ) 헤더 libz(zlib 압축 ) 헤더 liblog( 안드로이드로깅 ) 헤더 JNI 인터페이스헤더 C++ 지원을위한헤더
14.2 안드로이드 NDK 설치 11 안드로이드애플리케이션패키지 (apk) 에네이티브라이브러리삽입가능 안드로이드 NDK 버전 r1- r4 NDK 에는효율적프로그램위한빌드시스템제공 NDKK 를사용하여 C/C++ 프로그램을안드로이드플랫폼에서자바애플리케이션과연동하여사용하게하는과정그림 [14-2] [ 그림 14-2] NDK 개발절차
14.2 안드로이드 NDK 설치 12 [ 실습 14-3] NDK 설치하기 (1) http://developer.android.com/sdk/ndk/index.html NDK 소스를다운로드받기위하여 NDK 사이트 http://developer.android. com/sdk/ndk/index.html을방문한다. 그리고 [ 그림 14-3] 처럼 androidndkr3-linux-x86.zip 파일을다운로드받는다. [ 그림 14-3] NDK 다운로드하기
14.2 안드로이드 NDK 설치 13 [ 실습 14-3] NDK 설치하기 (2) # wget http://d1.google.com/android/ndk/android-ndk-r3-linux-x86.zip (1) 방법대신에 wget 을사용하여 NDK 소스를다운로드받을수도있다. 리눅스서버에 /android/android-ndk-r3 디렉터리를생성하고리눅스용안드로이드 NDK 를다운로드한다. (3) unzip android-ndk-r3-linux-x86.zip NDK 파일을압축해제한다. (4) cd /android-ndk-r3 /android-ndk-r3 디렉터리에 /apps, /build, /docs, /out, GNUmakefile, README.txt 디렉터리와파일들이포함되어있는것을 [ 그림 14-4] 처럼확인한다. /apps 디렉터리에는안드로이드애플리케이션이들어갂다. NDK 예제를빌드할경우해당애플리케이션의 /libs 디렉터리에컴파일된라이브러리가저장된다. [ 그림 14-4] android-ndk-r3 디렉터리내용
14.2 안드로이드 NDK 설치 14 [ 실습 14-3] NDK 설치하기 (5) cd build (6) vi host-setup.sh; cd.. (7)./build/host-setup.sh host-setup.sh 를실행해서 [ 그림 14-5] 처럼결과가나타나면 NDK 설치가완성된것이다. 참고로 /build 에서실행하면안된다.
14.2 안드로이드 NDK 설치 15 [ 실습 14-3] NDK 설치하기 (7)./build/host-setup.sh host-setup.sh를실행해서 [ 그림 14-5] 처럼결과가나타나면 NDK 설치가완성된것이다. 참고로 /build에서실행하면안된다. [ 그림 14-5] /build/host-setup.sh 실행
14.3 NDK 기초실습 16 [ 실습 14-4] hellojni 애플리케이션 (1) vi hello-jni.c NDK 설치가정상적으로되었는지확인하기위해 NDK 에서제공하는샘플프로그램중에 hello-jni.c 를빌드하여실행해본다. hello-jni.c 파일은단순히 Hello world, hellojni! 라는텍스트를출력하는파 일이다.
14.3 NDK 기초실습 17 [ 실습 14-4] hellojni 애플리케이션 (2) make APP=hello-jni NDK 의루트위치에서 make APP=hello-jni 명령어를입력하면 [ 그림 14-6] 처럼된다. hello-jni.c 파일이 Android.mk 파일에의해 libhello-jni.so 라는라이브러리로생성되고 hellojni.java 애플리케이션에서는생성된라이브러리를참조해구동하게된다. [ 그림 14-6] 빌드하기
14.3 NDK 기초실습 18 [ 실습 14-4] hellojni 애플리케이션 (3) cd /armeabi; ls ls 명령으로 hello-jni 빌드결과 libhello-jni.so 동적라이브러리가생성된것을 [ 그림 14-7] 처럼확인한다. [ 그림 14-7] libhello-jni.so
14.3 NDK 기초실습 19 [ 실습 14-4] hellojni 애플리케이션 (4) HelloJni.java 파일을작성한다. NDK 에서빌드된라이브러리는안드로이드프로그램에서바로사용할수없다. (3) 에서확인한 libhello-jni.so 를사용하는안드로이드애플리케이션프로그램을작성해야한다. 리눅스서버 \android\android-ndk-r3\appshellojni\project \src\com\example\hellojni 경로에있는 HelloJni.java 파일을확인해본다. 다음 < 소스 14-3> 은 HelloJni.java 파일의내용이다.
14.3 NDK 기초실습 20 [ 실습 14-4] hellojni 애플리케이션 (5) 리눅스서버의 \android\android-ndk-r3\apps\hello-jni 내용을에뮬레이터가동작하는윈도우 PC D:\android\ndk\hello-jni 로젂송한다. [ 그림 14-8] 처럼짂행한다. [ 그림 14-8] \android\android-ndk-r3\apps\hello-jni 전송
14.3 NDK 기초실습 21 [ 실습 14-4] hellojni 애플리케이션 (6) 윈도우 PC 에젂송된프로젝트를확인한다. 윈도우 PC 에젂송된프로젝트가 [ 그림 14-9] 처럼확인된다. [ 그림 14-9] 윈도우에 android\ndk\ 로전송된 project
14.3 NDK 기초실습 22 [ 실습 14-4] hellojni 애플리케이션 (7) 이클립스에서새로운프로젝트생성하기 이클립스에서새로운프로젝트를생성한다. 이클립스를구동하고, File New Project Next 를선택하면새로운안드로이드프로젝트생성입력창이나타난다. [ 그림 14-10] 안드로이드프로젝트생성
14.3 NDK 기초실습 23 [ 실습 14-4] hellojni 애플리케이션 (7) 이클립스에서새로운프로젝트생성하기 ( 계속 ) [ 그림 14-11] 처럼이클립스에 Hello-Jni 프로젝트가추가된것을확인할수있다. [ 그림 14-11] 이클립스에생성된프로젝트보기
14.3 NDK 기초실습 24 [ 실습 14-4] hellojni 애플리케이션 (8) JNI 라이브러리추가 다음은리눅스서버에서 NDK 로작성한 JNI 라이브러리 \libs\armeabi\libhellojni.so 를이클립스의프로젝트에포함시켜야한다. 라이브러리 \libs 디렉터리젂체를 [ 그림 14-12] 처럼 D:\android\ndk\project\libs 로이동시킨다. [ 그림 14-12] 라이브러리추가하기
14.3 NDK 기초실습 25 [ 실습 14-4] hellojni 애플리케이션 (9) 애플리케이션에서라이브러리실행하기이클립스화면에서 Hello-Jni 프로젝트를빌드하기위하여 RUN 한다. 에뮬레이터가구동되면서 Hello world, hellojni! 라는텍스트가 [ 그림 14-13] 처럼출력된다. [ 그림 14-13] Hello-Jni 프로젝트실행결과
14.4 NDK 고급실습 26 LED 하드웨어 ARM GPIO 포트에연결 3 개의 LED 물리주소에비트값출력으로제어 [ 그림 14-14] 타깃보드의 3 개의 LED 위치
14.4 NDK 고급실습 27 LED 디바이스드라이버 드라이버를안드로이드커널에모듈로서등록 Open, read, write, module_init 물리주소, 가상주소매핑
14.4 NDK 고급실습 28 [ 실습 14-5] JNI 라이브러리생성및다운로드 (1) vi led_test.c LED 드라이버를테스트할수있는프로그램 led_test.c를 JNI 라이브러리로인터페이스를만드는작업을짂행한다. 위와같이선언하면안드로이드애플리케이션의패키지이름은 com_hybus_ led 가된다.
14.4 NDK 고급실습 29 [ 실습 14-5] JNI 라이브러리생성및다운로드 (2) make clean APP=led_test 앞에서알아본 led_test.c 파일을컴파일해보도록한다. 컴파일을하기위해서는리눅스서버에 android-ndk 가설치되어있어야한다. LED 제어예제에대한 JNI app/led_test/project/jni/led_test.c 소스를컴파일하기젂에 make clean 명령어를통하여기존에있던 LED 제어라이브러리파일을삭제한다. (3) make APP=led_test 그리고다시 make 명령으로새롭게 [ 그림 14-15] 처럼컴파일한다. [ 그림 14-15] JNI 라이브러리컴파일
14.4 NDK 고급실습 30 [ 실습 14-5] JNI 라이브러리생성및다운로드 (4) cd app/led_test/project/armeabi; ls 컴파일된라이브러리파일은 app/led_test/project/libs/armeabi/ 로이동하여확인해보면앞에서컴파일한 LED 제어라이브러리파일이생성된것을 [ 그림 14-16] 처럼볼수있다. [ 그림 14-16] JNI 라이브러리생성
14.4 NDK 고급실습 31 [ 실습 14-5] JNI 라이브러리생성및다운로드 (5) mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system 위에서생성한 libled-jni.so 라이브러리파일을사용하기위해서는라이브러리파일을 H-AndroSV210에옮겨서실행하여야한다. adb를사용하여 H-AndroSV210에연결하여생성된 libled-jni.so 파일을다운로드한다. [ 그림 14-17] libled-jni.so 라이브러리파일타깃으로이동하기
14.4 NDK 고급실습 32 [ 실습 14-5] JNI 라이브러리생성및다운로드 (6) 위의작업을짂행하였으면 adb 를사용하여위에서생성한 libled-jni.so 파일을 /system/lib 이하로 [ 그림 14-18] 처럼이동한다. [ 그림 14-18] libled-jni.so 파일저장
14.4 NDK 고급실습 33 [ 실습 14-6] LED 제어안드로이드애플리케이션생성 (1) cd /mnt/cdrom/sv210_android_100822/app LED를제어하기위한소스가 APP 폴더에 Source.tgz 파일로압축되어있다. (2) tar zxvf Source.tgz [ 그림 14-19] 처럼 /SV210_Test_app라는폴더이하에압축이해제된다. [ 그림 14-19] LED 제어애플리케이션파일 Source.tgz 압축해제
14.4 NDK 고급실습 34 [ 실습 14-6] LED 제어안드로이드애플리케이션생성 (3) cd SV210_Test_app; ls 해당폴더로이동하여폴더내용을확인한다. (4) Led 폴더를이클립스의프로젝트에추가한다. 이클립스메뉴에서 File New Project Android Project 화면에서 Contents 항목의 Create project from existing source 를선택하고, Location에서추가할프로젝트의경로를지정해준다. [ 그림 14-20] 처럼설정이되어있는지확인한후에 Finish 버튼을누른다. [ 그림 14-20] LED_Test 프로젝트추가
14.4 NDK 고급실습 35 [ 실습 14-6] LED 제어안드로이드애플리케이션생성 (5) 프로젝트가정상적으로추가되었으면좌측의 Workspace 화면에 Led 라는프로젝트가추가된것을볼수있다. (6) Led.java 를확인한다. 추가된 Led 라는프로젝트아래의 src/com.hybus.led/led.java 파일을오픈하면다음과같은내용을확인할수있다. 다음은 Led.java 의젂체소스의내용이다.
14.4 NDK 고급실습 36 [ 실습 14-6] LED 제어안드로이드애플리케이션생성 (7) 실행 애플리케이션은라이브러리파일에접근하여라이브러리내에있는내용을호출한다. NDK 로작성된애플리케이션은 C 언어자체가 VM 에서실행되는 Java 보다실행속도가빠르기때문에속도면에서유리하다. 하지만 NDK 를따로빌드해야하고프로그래밍이 Java 로만작성하는것보다까다로운단점이있다. 실행결과는 [ 그림 14-21] 과같다. [ 그림 14-21] Led.java 실행결과
14.4 NDK 고급실습 37
안드로이드 SDK 업데이트 38 SDK 파일을다운로드한후설치하는과정이다소오랜시갂 (20~40 분 ) 소요 ( 각종레벨의안드로이드 SDK 플랫폼, 문서, Google API 를다운로드및설치 )
안드로이드 SDK 업데이트 39 ADB(Android Debug Bridge) 재시작창이나타나면 [Yes] 클릭
안드로이드 SDK 업데이트 40 USB 장치를지원하기위한 ADB 를업데이트하면 Installing Archives 창을닫는다
안드로이드 SDK 업데이트 41 Android SDK and AVD Manager 창의좌측에있는 Installed Packages 를선택하면업데이트된 SDK 목록이나타남 (14 개 )
AVD 와 SD 카드생성
AVD 생성 43 AVD 란 Android Virtual Devices SDK 1.5 부터에뮬레이터를실행하기위하여최소 1 개의 AVD 필요 AVD 로인하여여러버젂의안드로이드디바이스를위한애플리케이션을각각의버젂과 SDK Add-On 에맞게테스트가능 예를들어카메라가있는경우, 쿼티자판이있는경우, 1.1 SDK 탑재한단말, 1.5 SDK 를탑재한디바이스등여러가지구성을가지고있는가상의디바이스를지원가능하게함 각 AVD 마다하나의안드로이드에뮬레이터를구동할수있음
AVD 생성 44 이클립스툴바에서 [Android AVD and SDK Manager] 버튼을클릭
AVD 생성 45 Android AVD and SDK Manager 창의우측에있는 [New ] 버튼을클릭
AVD 생성 46 Create new AVD 창의 Name 항목에적절한디바이스이름선택
AVD 생성 47 Target 에사용할 SDK 플랫폼 API 버전혹은 Google API 버전을선택
AVD 생성 48 AVD 생성완료
AVD 생성 49 Google Map API 를사용하기위한 AVD 생성
가상 SD 카드생성 50 SD 카드의생성 SD 카드의크기를입력 혹은기존에생성한 SD 카드를사용하려면 File 을선택한후 [Browse ] 버튼을눌러가상 SD 카드파일을선택
AVD 와가상 SD 카드확인 51 이클립스툴바에서 [Android AVD and SDK Manager] 버튼을클릭 왼쪽의 Virtual Devices 선택
안드로이드 SDK 둘러보기
안드로이드 SDK 란? 53 안드로이드애플리케이션의개발, 테스트, 디버그하는데필요한모든 API 들과도구를포함 안드로이드 SDK 플러그인을사용하여 Eclipse IDE 에적용가능 안드로이드 SDK 폴더
안드로이드 SDK 란? 54 주요구성요소 안드로이드 API 구글이네이티브안드로이드애플리케이션을개발하기위하여사용한것과동일한라이브러리 개발도구 안드로이드응용프로그램개발, 즉애플리케이션의컴파일, 디버그, 테스트하는데필요한각종도구 이클립스상에서개발하는경우이도구들을직접다루지는않음 풍부한문서 안드로이드 SDK 의각종패키지, 클래스에대한설명 안드로이드개발을시작하는방법과원리를설명 Java 의경우 Java SDK Documentation 과유사 샘플코드 안드로이드 API 기능의사용법을나타낸예제프로그램코드 이클립스프로젝트에추가하여실행가능
주요안드로이드도구 55 emulator.exe Dalvik 가상머신의구현으로하드웨어중립적 안드로이드용응용프로그램이실제휴대단말에서동작하는모습을 PC 로확인 옵션을포함하여실행가능하지만대부분이클립스에서구동 구동하는것은리눅스시스템을부팅하는것이기때문에장시갂요구. 에뮬레이터를구동한후계속작업가능
주요안드로이드도구 56 adb.exe Android Debug Bridge 안드로이드에뮬레이터혹은안드로이드단말기에접속할수있도록하는클라이언트 / 서버애플리케이션 에뮬레이터혹은안드로이드단말기에명령을내리는역할 애플리케이션의설치 / 제거작업가능 안드로이드단말기에나에뮬레이터의상태를관리 mksdcard.exe 하드디스크의일부분을안드로이드에뮬레이터에서가상의 SD 카드로생성 dx.bat Dalvik VM 에구동할수있는응용프로그램으로만들어주는컴파일러 컴파일이완료되면 *.dex 의확장자를가짂파일을생성
주요안드로이드도구 57 aapt.exe Android Asset Packaging Tool 배포가능한안드로이드패키지파일 (*.apk) 을생성 aidl.exe Android Interface Description Language 안드로이드디바이스에서 2 개의프로세스가 IPC(Inter Process Communication) 를사용하여대화할수있는코드를작성하기위한언어 COM 혹은 CORBA 와유사한인터페이스기반이지만더가벼움 sqlite3.exe SQLite 데이터베이스파일을제어하는도구
주요안드로이드도구 58 ddms.bat Dalvik Debug Monitor Service 활성화된스레드를감시및중단하는도구 활성화된모든에뮬레이터의파일시스템을탐색하는도구 DDMS 사용
주요안드로이드도구 59 ddms.bat DDMS 화면