본문 바로가기

Programming/android

android NDK 개발하기 설정.

출처 : http://thdev.net/117


Android NDK r7(최신버전)을 설치하고 build하는 방법을 설명하겠습니다.

 r7 이라고해서 기존 버전과 설치 방법이 다르거나 하지는 않았습니다. 다른 블로그를 참고해서 실행방법을 알아보고 제 환경에 맞는 NDK를 사용해보았습니다. 이번 글은 Ubuntu에서 NDK를 설치하고 NDK에서 제공하는 예제 코드를 사용해서 테스트 해보도록 하겠습니다.

android 개발자 페이지
  http://d.android.com

NDK 다운받기
 NDK는 위의 홈페이지로 접속하여, SDK -> android NDK, r7 을 클릭하시고 해당 OS 버전에 맞는 NDK를 다운 받으시면 됩니다.

다운 받은 NDK를 압축 해제하기
 명령어를 통한 압축 해제 방법입니다. tar -xvf android-ndk-r7b-linux-x86.tar.bz 으로 압축 해제를 하거나


다운로드 폴더로 직접이동하여 압축 해제하시면 됩니다.(윈도우와 동일)

NDK 예제 사용하기
 압축 해제가 완료되면 해당 폴더에 android-ndk-r7b 폴더가 생깁니다. 해당 폴더에 접근하면 NDK 관련 파일들이 나열되어 있습니다. docs폴더에는 ndk사용에 관한 설명과 설치관련 설명 문서가 들어있습니다. 이중 홈페이지(안드로이드 개발자 페이지)의 ndk 사용법 설명에  OVERVIEW.HTML 파일을 읽어보라고 되어 있습니다.

 이번 설명에는 NDK에서 제공하는 예제를 사용해보려고 합니다. 예제가 있는 경로는 ./samples/ 폴더안에 있고, 이중 ./hello-jni/ 샘플 프로젝트를 사용해보겠습니다. 먼저 c코드를 확인하고 빌딩하기 위해 jni 폴더로 이동합니다. jni 폴더에는 Android.mk(메이크 파일)과 hello-jni.c(소스코드)가 포함되어 있습니다.

hello-jni.c
 Apache License 2.0에 관한 내용이 설명되어 있고, string.h jni.h 가 포함되어 있습니다.
 아래 코드는 Hello TaeHwan!! My Blog : http://thdev.net 을 jstring(jni에서 사용하는 string) 값으로 return 해주는 코드입니다.
 함수명은 stringFromJNI(JNIEnv* env, jobject thiz) 이 됩니다.

 함수명에 Java_com_example_hellojni_HelloJni 가 추가로 붙어있습니다.
   com_example_hellojni 이 부분은 java 패키지 파일명 이름이 됩니다.
   HelloJni : 이 부분은 java class의 이름이 됩니다.
   만약 함수명이 result이고, 패키지명이 net.thdev.test, Class 명이 hello 라면
   Java_net_thdev_test_hello_result(); 가 되게 됩니다.

String 값은 UTF 형으로 변환하여 return 됩니다.

Android.mk 파일
 ndk-build 하기위해 필요한 파일입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LOCAL_PATH:=$(call my-dir)
   my-dir은 현재 위치(Android.mk의 위치) 현재 소스코드가 존재하는 폴더위치를 반환
 
include $(CLEAR_VARS)
   : 빌드시 GNU Makefile에 필요한 변수들을 초기화
     (e.g. LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, etc...)
 
LOCAL_MODULE
  : 각 모듈을 식별하기 위해 정의되어야 하고, 고유한 이름과 공백을 포함할 수 없습니다.
    "hello-jni" 파일의 공유 라이브러리 모듈은 "libhello-jni.so"가 됩니다.
 
LOCAL_SRC_FILES
   : head를 제외한 C 소스파일이 나열되어야 합니다.
 
include $(BUILD_SHARED_LIBRARY)
  : 공유 라이브러리를 만들지점

이정도로 설명이 되겠네요. 영어가 짧아서 해석하는데 문제가 많습니다. 원본 파일의 위치는 /docs/ANDROID-MK.html 파일을 참고해주세요.

ndk-build
 build 하는 방법입니다. 현재는 PATH로 등록하지 않았기에 아래처럼 사용할 수 있습니다.
 제 android-ndk-r7b의 위치는 Downloads에 있습니다.
  명령어는 : ~/Downloads/android-ndk-r7b/ndk-build 로 실행했습니다. android-ndk-r7b의 위치에 따라 변경하시면 됩니다.

build가 완료되면 아래 처럼 확인이 가능합니다.

Android 실행해보기
 New Android Project를 통해서 실행 가능합니다. 최신 NDK r7버전의 예제코드는 android 4.0.3 에뮬레이터로 동작합니다. 
 Create project from existing source를 통해서 가져오시면 됩니다. 경로는 위에서 작업했던 경로이며 hello-jni 폴더를 선택하셔야 합니다.

아래와 같이 HelloJni.java와 libs/armeabi/폴더 아래 3개 파일을 확인 가능합니다. gdb.setup, gdbserver, libhello-jni.so입니다.

java 코드
 static 으로 hello-jni를 호출 합니다. ndk를 통해서 생성된 lib파일의 이름은 libhello-jni.so 입니다. load할때는 hello-jni만 입력하면 됩니다.

1
2
3
static {
    System.loadLibrary("hello-jni");
}

native 인터페이스
 public native String  stringFromJNI();
   stringFromJNI() 코드는 위 C코드에 작성된 함수를 호출 하기 위한 Native 인터페이스입니다.

코드 사용

1
2
3
TextView  tv = new TextView(this);
tv.setText( stringFromJNI() )
setContentView(tv);
TextView를 생성하고, 거기에 setText해주는 코드입니다. stringFromJNI()를 호출 합니다.

아래와 같은 결과를 얻을 수 있습니다.


마무리
 급하게 한다고..내용이 엉망인것 같습니다. 좀더 공부해서 추가내용 올리도록 하겠습니다. 간단한 프로그램 작성도 하구요!