BLOG ARTICLE Operating Systems/Android | 4 ARTICLE FOUND

  1. 2010.09.02 VMware에 Live Android OS 실행하기
  2. 2010.08.30 JNI 헤더파일 - jni.h
  3. 2010.08.26 NDK를 이용한 안드로이드 App 기본예제 7
  4. 2010.08.26 NDK 및 JNI 기본 개념 7

VMware에 Live Android OS 실행하기

Operating Systems/Android 2010. 9. 2. 16:13 Posted by 알 수 없는 사용자

먼저, 안드로이드 OS를 x86 플랫폼 위에서 실행하기 위해 아래의 사이트에서 안드로이드 OS 이미지 파일을 다운로드 합니다.




위 사이트에서 두 개로 나누어진 파일을 모두 다운로드합니다. 다운로드가 끝나면 cmd를 실행시킨 후, 아래의 명령어를 입력해서 하나의 이미지 파일로 합쳐줍니다.

COPY /B liveandroidv0.3.iso.001 + liveandroidv0.3.iso.002 liveandroidv0.3.iso




그럼, 이제부터 만들어진 이미지 파일을 이용해 VMware에서 설치를 하면 되겠습니다.






이미지 파일을 저 처럼 먼저 넣어줘도 되고, 나중에 넣어줘도 됩니다.




이 후의 설정은 권장사항으로 된 기본 설정을 그대로 유지한 상태로 넘어갑니다. 개인적으로 수정해도 상관없습니다. 저는 플로피디스크와 usb장치를 제거해주었습니다.

이제 VMware에서 Power On을 클릭해 실행하면 다음과 같은 모습으로 시작하게 됩니다.










안드로이드 OS 부팅 완료되었습니다. ^^
(참고로 뒤로 가기는 ESC 키를 이용하면 됩니다.)


'Operating Systems > Android' 카테고리의 다른 글

JNI 헤더파일 - jni.h  (0) 2010.08.30
NDK를 이용한 안드로이드 App 기본예제  (7) 2010.08.26
NDK 및 JNI 기본 개념  (7) 2010.08.26
AND

JNI 헤더파일 - jni.h

Operating Systems/Android 2010. 8. 30. 21:26 Posted by 알 수 없는 사용자

NDK환경을 구축하고, JAVA의 JNI 기술을 이용하여 안드로이드 앱을 개발하는데 C 혹은 C++을 사용할 수 있다고 하였습니다. 이 전에 포스팅한 글 중에 예제 실습을 한 번 한적이 있었습니다.
(NDK 프로그래밍 예제 : http://viiiin.tistory.com/category/Android%20Dev)
여기에 나온 my_lib.c 코드에서 사용 된 헤더파일이 궁금해서 좀 살펴보았습니다.

my_lib.c에서 사용 된 헤더파일은 ssu_os_android_NativeCall.h 입니다. 이 파일은 또 내부에서 jni.h 파일을 사용하고 있습니다.

jni.h 파일의 내용은 다음과 같습니다.

보시는 것과 같이 3개의 헤더파일을 포함하고 있습니다.

#include <stdio.h>
#include <stdarg.h>
#include "jni_md.h"

첫 번째로 stdio.h 파일은 다들 아시다시피 C의 표준 입출력 관련 함수들을 제공합니다.
두 번째로 stdarg.h 파일은 가변 인자 리스트를 처리하는데 사용됩니다. 주로 execl()함수나 printf()함수에서 사용됩니다.
마지막으로 jni_md.h 파일에는 몇 가지 호출 규약과 변수 타입이 재정의 되어 있습니다.

jni_md.h 파일의 내용은 다음과 같습니다.

JNIEXPORT와 JNIIMPORT는 각각 __declspec(dllexport)와 __declspec(dllimport)로 정의되어 있습니다. 이것으로 C++에서 DLL의 데이터 및 함수, 클래스 또는 클래스 멤버 함수를 이용할 수 있습니다. JNICALL은 윈도우즈 API 함수들의 기본 호출 규약인 __stdcall로 정의되어 있습니다. 그 외에 long은 jint로, __int64는 jlong과 같이 변수 타입도 재정의 되어 있습니다.

'Operating Systems > Android' 카테고리의 다른 글

VMware에 Live Android OS 실행하기  (0) 2010.09.02
NDK를 이용한 안드로이드 App 기본예제  (7) 2010.08.26
NDK 및 JNI 기본 개념  (7) 2010.08.26
AND

NDK를 이용한 안드로이드 App 기본예제

Operating Systems/Android 2010. 8. 26. 12:25 Posted by 알 수 없는 사용자

1. 개발환경

Host OS
  - Windows 7 Ultimate x86

Cygwin
  - version 2.712
  - http://www.cygwin.com

Eclipse
  - Eclipse IDE for Java Developers : Galileo Packages(ver 3.5)
  - http://www.eclipse.org/downloads

JDK
  - Java SE Development Kit 6u21
  - http://www.oracle.com/technetwork/java/javase/downloads/index.html

Android SDK & NDK
  - Android SDK Package : android-sdk_r06-windows.zip
  - Android NDK Package : android-ndk_r4b-windows.zip
  - Android SDK and AVD Manager(Packages and Archives) :
    http://dl-ssl.google.com/android/eclipse
    http://developer.android.com/sdk/index.html


2. Cygwin 설치 및 환경설정

Cygwin을 사용하는 이유는 기본적으로 Android 개발 환경이 Linux 기반으로 되어 있기 때문이고, ndk-build 명령으로 빌드하기 위함입니다. 개인적으로 MinGW를 사용하시는 분은 MinGW에서 하셔도 좋습니다.

Cygwin 설치 시에 Select Packages 단계에서 'make' 체크 후 설치해 줍니다.


저는 이미 설치되어 있기 때문에 'Keep'이라고 나오는 것입니다. 'Skip'부분을 클릭하면 'Install'로 바꿀 수 있습니다. 같은 방법으로 Search 기능을 이용하여 'vim'을 검색 후, Editors 카테고리의 vim을 'Install'로 바꾼 후 설치해 줍니다. 혹시 나중에 추가로 필요한 패키지가 생길 경우 다운받은 Cygwin 폴더의 setup.exe를 실행시켜 패키지를 추가할 수 있습니다.

다음으로 Cygwin을 실행하여 ndk-build 명령을 어디서든 실행할 수 있게 하기 위해 .bash_profile 파일의 PATH 환경변수에 경로를 추가시켜 줍니다.


/cygdrive 는 윈도우의 '내 컴퓨터'와 같은 경로입니다. 저의 경우에는 다운받은 NDK 폴더가 아래의 경로에 있기 때문에 그림과 같이 PATH설정을 해 준 것입니다. 본인의 경로에 맞게 수정해주면 됩니다.

D:\UTIL\etc\Android_NDK_r4b\android-ndk-r4b


그럼 이제 cygwin은 모두 준비가 끝난 상태입니다.


3. Eclipse Android Project 생성

이제 Eclipse를 이용하여 안드로이드 프로젝트를 만들어 보도록 하겠습니다.

먼저, [File]->[New]->[Project]를 선택하면 다음과 같은 창이 나옵니다.



Android Project를 선택한 후, Next를 클릭합니다.

아래 그림과 같이 빈 곳을 채워준 다음 Finish를 클릭합니다. 이 때, 저는 "Use default location"을 체크 해제 한 후, cygwin의 홈디렉토리에 프로젝트 폴더를 만든 후 이곳의 경로를 지정해 주었습니다.




다음 그림과 같이 프로그래밍할 준비를 마쳤습니다.





4. 예제 프로그래밍

그럼 이제 본격적으로 안드로이드 App 예제를 실행하기 위한 프로그래밍을 해 보도록 하겠습니다.

① Activity Layout 구성
위치 : [HelloAndroid]-[res]-[layout]-[main.xml]
텍스트뷰와 버튼을 각각 하나씩 추가합니다.



② Activity 구현
위치 : [HelloAndroid]-[src]-[ssu.os.android]-[NdkTestActivity.java]
버튼 클릭으로 jni를 호출하는 소스를 onCreate에 구현하였습니다.
혹시 에러가 나거든 [Ctrl+Shift+O]를 이용해 자동으로 import를 수행해 줍니다.


③ Class 만들기
위치 : [HelloAndroid]-[src]-[ssu.os.android]-[NativeCall.java]
위의 위치에 NativeCall.java 파일을 새로 생성합니다.
native 함수가 들어있는 NativeCall 클래스를 생성합니다. native 키워드는 javah가 헤더파일을 생성할 때 참조하게 되는 키워드 입니다. 구현부는 없습니다. static 부분은 class의 객체가 생성될 때 (new) 되어질 때 호출됩니다. "my_lib"는 ndk-build로 생성된 라이브러리 이름입니다. 파일명은 libmy_lib.so 입니다.


④ javah 실행
~/bin 디렉토리에서 javah를 실행합니다. javah는 내부적으로 ./ssu/os/android/NativeCall.class 파일을 참고하여 헤더파일을 생성하게 됩니다. 헤더 파일명은 패키지명과 클래스명을 참고해서 생성됩니다. -o 옵션을 사용하면 파일명을 임의로 지정할 수 있습니다. 프로젝트 폴더에 /jni 폴더를 생성하고, 만들어진 헤더파일을 옮겨줍니다.


- 생성 된 헤더파일(ssu_os_android_NativeCall.h) 내용
native 키워드로 되어있던 함수들이 jni 형태 함수 프로토타입을 확인할 수 있습니다.
복잡해 보이지만 C문법입니다.


⑤ 함수 구현
위치 : [HelloAndroid]-[jni]-[my_lib.c]
/jni 폴더에 my_lib.c 파일을 만들어서 다음과 같이 함수를 구현합니다. 두 개의 함수가 있는데 단순히 string을 리턴해 주는 함수와 두 정수를 입력받아 더한 후 리턴하는 함수입니다.


⑥ Android.mk 파일 작성
위치 : [HelloAndroid]-[jni]-[Android.mk]
다운받은 Android NDK 폴더의 /sample/hello-jni/jni 의 Android.mk 파일을 현재 프로젝트의 /jni 폴더에 복사한 후, 다음과 같이 수정하여 사용합니다. 수정 된 내용은 19, 20 라인의 LOCAL_MODULE 과 LOCAL_SRC_FILES 입니다.


⑦ NDK Build
프로젝트 루트 혹은 /jni 디렉토리에서 "ndk-build" 명령을 실행합니다.


빌드가 끝나면 프로젝트 폴더 밑에 /libs 폴더가 생성되고, 라이브러리인 .so 파일이 생성 된 것을 확인할 수 있습니다.




⑧ 에뮬레이터 실행
위의 과정이 정상적으로 진행되었으면 Eclipse에서 에뮬레이터를 실행시켜 줍니다. 안드로이드 부팅 과정이 끝나면 우리가 작성한 App을 볼 수 있을 것입니다.


Call JNI" 버튼을 누르게 되면 jni가 호출되어 스트링을 가져와 화면(TextView)에 뿌려주게 됩니다.



<참고 사이트>
[1] http://shchoi82.springnote.com/pages/6150375



'Operating Systems > Android' 카테고리의 다른 글

VMware에 Live Android OS 실행하기  (0) 2010.09.02
JNI 헤더파일 - jni.h  (0) 2010.08.30
NDK 및 JNI 기본 개념  (7) 2010.08.26
AND

NDK 및 JNI 기본 개념

Operating Systems/Android 2010. 8. 26. 11:50 Posted by 알 수 없는 사용자

기본적으로 NDK와 JNI의 기본 개념에 대해 알아보는 이유는, 안드로이드 App을 개발하는데 있어서 Java뿐만 아니라 C/C++ 언어를 사용하기 위함입니다.

NDK : Native Development Kit

NDK는 JAVA의 JNI 기술을 이용하여 안드로이드 App(Java)과 안드로이드 Library(C/C++) 계층을 연결해주는 역할을 합니다.

JVM에서 C/C++과 같은 언어로 구현된 것을 네이티브 함수(네이티브 메소드)라 합니다. JDK는 표준 프로그래밍 인터페이스인 JNI를 지원합니다. 즉, JVM에서 C/C++ 코드를 다소 이식성 있게 호출할 수 있습니다.

JNI 기본 : 네이티브 메소드(Native method)란 자바에서 특화된 메소드로써, 다른 언어로 구현되어 있으며 native 라는 예약어를 가지는 메소드를 말합니다.

■ 네이티브 메소드를 이용하는 몇 가지 공통적인 이유

1. 이미 다른 언어로 상당히 크고 중요한 코드를 작성했고, 자바로 동일한 코드를 재작성하기를 원치 않으며, 단지 기존 코드를 재사용하고 싶을 때 JNI를 사용합니다.

2. 우리가 시스템 디바이스에 접근할 필요가 있거나 혹은 자바의 성능을 넘어선 플랫폼 특정적인 작업을 수행할 경우에 JNI를 사용할 수 있습니다. 사실 많은 자바 라이브러리 루틴들이 결과적으로는 내부(private) 네이티브 메소드를 이러한 목적으로 호출하고 있습니다. 예를 들면, I/O, threading, networking 패키지들 전부가 내부 네이티브 메소드를 포함합니다.

3. 자바로 구현하기엔 어플리케이션이 매우 느릴 수 있으며, C++에서 time-critical 코드를 구현함으로써 성능의 향상을 가져올 수 있을 경우에 JNI를 사용합니다.

■ JNI의 부정적인 부분

1. 이식성(portability)을 잃게 됩니다. 많은 자바 라이브러리가 네이티브 메소드를 사용하고 있는데, 새로 추가된 네이티브 메소드가 모든 플랫폼에서 호출 가능한 동일한 C++ 코드를 가진다면, 그 코드는 자바에서 가장 먼저(in the first palce) 구현되어질 수 있습니다.

2.안정성(safety)를 잃게 됩니다. 네이티브 메소드는 자바 메소드처럼 동일한 보호를 보장받지 못합니다. 일단 C++ 코드에 들어가게 되면, 자바에서의 모든 것이 백지화 되고, 메모리 추적, 포인터의 사용, 그리고 배열 바운딩에 의한 C++ 버그들이 발생할 수 있습니다.

3. 네이티브 메소드의 구현은 .dll 및 .so와 같은 동적 라이브러리들 내에서 이루어집니다. 네이티브 메소드를 사용하는 자바 코드는 반드시 동적 라이브러리들을 호출하는데, 이는 자바 시큐리티 매니저에 반대되는 연산입니다. 일례로 애플릿에서는 일반적으로 사용자 정의 네이티브 메소드를 호출할 수 없습니다.

4. 코드 자체가 방해물이 될 수 있습니다. 타이핑 오류와 같은 컴파일 오류에 종종 직면하게 됩니다.

■ JNI를 사용하는 기본 절차

1. 예약어 native 를 표시함으로써 자바로 구현되지 않는 특정 메소드들을 가지는 자바 클래스를 선언합니다.

2. JNI 프로토콜을 사용하여 네이티브 메소드를 구현하는 C/C++ 함수를 작성합니다.

3. C/C++ 함수를 컴파일하고 동적 라이브러리에 삽입합니다.

4. JVM이 동적 라이브러리를 호출합니다. 네이티브 메소드에 대한 호출은 동적 라이브러리 내에서 구현된 호출에 의해 다루어집니다.

다음 포스팅에는 실제 NDK를 이용하여 안드로이드 App을 만드는 간단한 예제를 만들어 보도록 하겠습니다.
수고하셨습니다. ^^

<참고 자료>
[1] Mark Allen Weiss, C++ for Java Programmers - "JNI:JAVA와 C++의 연동"



'Operating Systems > Android' 카테고리의 다른 글

VMware에 Live Android OS 실행하기  (0) 2010.09.02
JNI 헤더파일 - jni.h  (0) 2010.08.30
NDK를 이용한 안드로이드 App 기본예제  (7) 2010.08.26
AND