블로그 이미지
JoyfulLife

공지사항

최근에 받은 트랙백

글 보관함

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  

NDK , 문서 번역, OVERVIEW.TXT

2010.09.16 10:32 | Posted by JoyfulLife

소개
NDK 는 c/ c++ 로 컴파일된 파일을 어플리케이션 패키지로 넣을 수 있게 해주는 툴이다.

중요한 점:
 1.5 이상의 플랫폼만 NDK를 쓸 수 있다.
1.0, 1.1 는 ABI 와 툴체인의 변화로 제공되지 않는다.


NDK 목표
 VM이  JNI 로 이식된 네이티비 코드를 당신의 어플이 사용할 수 있게 해준다.
 - 당신의 어플 소스 코드는 native 키워드를 선언해야 한다.
 native byte[] loadFile(String filePath);
-  당신은 반드시 함수가 선언된 native shared library 를 제공해야 한다. 그것은 당신의 .apk에 패키징될 것이다. 그 라이브러리는 표준 유닉스 convention 으로 이름이 붙여질 것이다. . (lib<something>.so),. 그리고 표준 JNI entry point 를 가지고 있어야 한다. (libFileLoader.so)
-당신의 어플은 정확하게 라이브러리를 로드해야한다. 예를 들자면,
 static{
System.loadLibrary("FileLoader");
}
 당신은 'lib'이란 것과 '.so' 를 사용해서는 안된다.


NDK 는 안드로이드 sdk를 보완해주고 다음과 같은 점을 도와준다.
 1. JNI-compatible shared librarie(ARM cpu 에서 돌아가는 안드로이드 1.5 플랫폼이상) 을 생성
 2. shared libraried 를 적당한 당신의 어플리케이션 프로젝트에 복사해준다. 그것은 자동으로 당신의 final .apks 에 더해질 것이다
 3.나중의 NDK revision 때 우리는 native code 디버그 툴을 제공할 것이다. 그것은 원격 gdb connection을 통한 것이다. 그리고 soure/symbol 정보를 디버깅 해줄 것이다.

NDK는 더 많은 것을 제공한다.
 1.리눅스 상이나, OS X , 윈도우(with cygwin) 에서 native ARm 바이너리를 생성할 수 있는 cross-toolchains(컴파일러, 링커, 기타.. )
 2..안드로이드를 도와주는 안정된 native APIs의 리스트들과 일치되는 system headers. 이것은 나중에 발매되는 플랫폼의 정의와 일치되는 것을 보장한다.
 이것은 docs/STABLE-APIS.TXT에 문서가 있다.
 중요한 점:
 다음 플랫폼의 업데이트와 release 때  많은 native system libraries 는 frozen 되지 않았다. 그리고 과감하게 바뀔 것이다. 또는 삭제될 것이다.
 3.빌드 시스템은 개발자가 short build files 을 쓸 수 있게 허용할 것이다. 빌드 시스템은 복잡한 toolchain/jplatform/cpu/ABI 들을 상대할 것이다. 다음 버전에의 NDK는 개발자의 build 파일을 변화를 요구하지 않는 더 많은 toolchains과 platform 시스템 인터페이스  를 제공할 수 있다.

II. 안드로이드 NDK의 non-goals:
 NDK는 안드로이드에서 돌아가는 generic native code 를 쓰는 좋은 방법이 아니다. 특수하게, 당신의 어플ㄹ은 자바로 적혀져야 하고, 안드로이드 life-cycle 을 만족해야 한다. 
 
 그렇지만 복잡한 native codd안에서 적은 wrapper 형태로 시작과 끝내는 것을 해주는 것은 가능하다. 

 JNI를 좋게 이해하는 것은 필요하다. 왜냐하면 많은 동작이 개발자들에게 특정한 액션을 요구하기 때문이다. 공통 표준 네이티비 코드가 필요한 것이 아니다. 이것을 다음을 포함한다.
 -VM 객체의 내용에 바로 접근이 가능하지 않다. (포인트를 얻을 수 없기 때문이다)
 -명백한 레퍼런스 관리를 유구한다. (네이트브 코드가 VM 객체를 제어하기 위해서)

NDK는 native api 와 라이브러리를 제공하기 위해서 시스템 헤더를 제공한다. 안드로이드 시스템은 많은 native shared libraries를 포함한다. 이것은 앞으로의 업데이트와 릴리스를 통한 변화를 위해서 잘 고려해야 한다.
 
 시스템 라이브러리는 앞으로 안정화된 NDK  API들의 세트에 더해질 것이다. 


III. 연습
 이것은 당신이 어떻게 native code를 NDK로 빌드할 수 있는지 러프한 방법을 보여준다. 
 1. $PROJECT/jni/  폴더에 native sourece들을 넣는다. 
 2. $PROJECT/jni/Android.mk 를 쓴다. 이것은 NDK build system에게 당신의 소스를 설명해줄 것이다. 
3 . 옵션: $PROJECT/jni/Application.mk 는 좀 더 자세하게 설명을 해준다. 이것은 APPLICATION-MK.TXT 문서를 봐라)
4.$NDK/ndk-build 로 빌드시켜라. 당신의 프로젝트 파일에서 빌드해야 한다. 

III.1 NDK 환경
 이전에는 build/host-setup.sh 로 빌드를 시켰지만 이번에는 제거되었다. 

III.2 C, C++ 위치
 $PROJECT/jni/ 에 둬라. 
 $PROJECT는 당신 어플리케이션의 프로젝트 패스이다. 
 
 당신은 jni 폴더를 구성하는 것에 자유롭다. 당신은 pseudo-unique 이름들을(com.<mycompany.><myproject>)  사용하지 않아도 된다. 
 
 c, c++ 을 제공된다. 
 Android.mk 를 조정하면 다른 곳에 저장을 해도 된다. 

III.3 Android.mk 빌드 script
 Android.mk 는 작은 빌드 스크립트 파일이다. 이것은 docs/ANDROID-MK.TXT 파일에 자세히 적혀 있다. 
 NDK 의 모듈은 다음이 따라 올 수 있다. 
- a static library
- a shared library
 
 당신의 Android.mk 에서 많은 모듈을 정의할 수 있다 

 NDK 는 다음의 빌드 스크립트를 찾을 것이다. 
 $PROJECT/jni/Android.mk

 만약 서브 디렉토리의 Android.mk 를 정의하고 싶다면 당신은 정확하게 탑레벨의 Android.mk 에 포함시켜야 한다. 
 (i.e include$(call all-subdir-makefiles)

III.4 Application.mk 빌드 파일( 옵션)
 


 

신고

티스토리 툴바