Android 2010. 12. 30. 16:18
반응형

출처 :http://shchoi82.springnote.com/pages/6150375

우선 NDK는 Native Developmet Kit의 약자입니다.

자바의 JNI기술을 사용하여 안드로이드 app(java)와 안드로이드 library(c/c++)계층을 연결해주는 역할을 합니다.

 

윈도우에서 사용 cygwin에서 사용하는 방법예제입니다.

 

1. NDK를 다운로드

   아래의 http://developer.android.com에서 ndk-android-r4b 를 다운받는다.

   ※ r4b의 r은 revision 4번째 버젼이라는 의미입니다.

       2010년 7월 30일 최신버젼이 r4b 이군요

그림1.png

 

 

2. cygwin설치

   아래의 www.cygwin.com에서 다운로드

그림3.png

 

그림4.png

 

   cygwin은 설치 인터넷 접속해서 다운로드후 설치됩니다.

   GNU awk또는 Nawk 와 GNU Make 3.81이상이 같이 설치되어야 합니다.

   awk는 이미 default에 들어가 있구요 make만 체크하시고 설치합니다.

   install 하시면 됨, 저는 이미 설치되어 있기때문에 Keep이라고 나오는군요

 

 

3. cygwin 환경설정

그림6.png

 

~/.vimrc파일 수정

 

그림5.png

ndk-build명령은 어디서든 실행하기 위해 PATH환경변수에 추가시켜줍니다.

위의파일은 ~/.bash_profile입니다.

※ /(루트)의 cygwin 디렉토리는 윈도우의 "내컴퓨터"와 같은경로입니다.

    android-ndk-r4b의 경로를 적절하게 넣어주시면 됩니다.

 

예제 소스 빌드

그림7.png

sample파일 디렉토리에서 

프로젝트 루트 또는 프로젝트\jni 폴더에서 ndk-build 하시면 빌드가 됩니다.


간단한 예제 실습

1. 액티비티 레이아웃구성 

   텍스트뷰 하나와 버튼하나 추가

그림8.png

 

2. 액티비티 구현

버튼클릭으로 jni를 호출하는 소스를 onCreate에 간단하게 구현 해봤습니다.

그림9.png

 

3. 간단한 클래스 만들기

   간단하게 native 함수가 들어가있는 NativeCall 클래스를 생성

   native 키워드는 javah가 헤더파일을 생성할때 참조하게 되는 키워드입니다. 구현부가 없습니다.

   ※ static 부분은 class의 객체가 생성될때 (new) 되어질때 호출됩니다. "my_lib"은 ndk-build로 생성된 라이브러리 이름입니다. 파일명은  libmy_lib.so 입니다.

그림10.png

 

 

4.  javah실행 헤더파일을 만듭니다.

    아래에 보시면 bin폴더에서 실행하고 있는것을 볼수 있습니다.

    javah는 내부적으로 ./ssu/os/android/NativeCall.class 파일을 참고하여 헤더파일을 생성하게됩니다.

    하위디렉토리를 페키지에 맞춰진 경로에 class파일 존재해야합니다.

 

    헤더파일명은 페키지명과 클래스명을 참고해서 아래와같이 생성됩니다.

    -o 옵션을 사용하면 파일명을 지정할수 있습니다.

    프로젝트 경로 밑에 jni 폴더를 생성하고 파일을 옮겨줍니다.

   

   

그림11.png

 

 생성된 헤더파일의 내용

 native 키워드로 되어있던 함수들이 jni형태 함수 프로토타입을 확인할수 있습니다.

 복잡해보이지만 C문법입니다.

※ ifdef __cpluscplus 에서보듯이 c++도 지원됩니다.

그림12.png

 

5. 함수구현

  my_lib.c 파일을 만들어 함수를 구현합니다.

  두게의 함수가 있는대 하나는 단순하게 string을 리턴해줍니다.

  다른 하나는 두정수를 입력받아 더한후 리턴.

그림13.png

 

6. Android.mk파일 작성

   기존의 hello jni 샘플의 파일을 가져와서 작성합니다.

   수정된내용은 LOCAL_MODULE , LOCAL_SRC_FILES 이 바뀌었습니다.

   LOCAL_MODULE에는 라이브러리 명을 써주시면 되고

   LOCAL_SRC_FILES는 작성하신 C소스 파일명을 넣어주시면 됩니다.

그림14.png

 

7. ndk-build

   프로젝트루트나 jni 경로에서 ndk-build명령을 실행합니다.

그림15.png

 

libs 폴더가 생성되고 라이브러리 .so파일이 생성된것을 확인할수 있습니다.

그림16.png

 

8. 에뮬레이터 실행

    위의 과정이 정상적으로 진행되었으면 아래와 같이 실행됩니다.

    버튼을 누르면 jni가 호출되어 스트링을 가져와 textview에 뿌려줍니다.

 

 그림20.png


반응형
posted by ssuk1010
: