NDK란?
안드로이드 SDK(software developement kit)은 알고 있을 것이다. 이처럼 JNI의 이용과 관련하여 안드로이드에서 네이티브기반 어플리케이션 혹은 프레임워크를 구축할 수 있도록 하는 툴킷이 바로 NDK이다.
NDK의 설치는 http://developer.android.com/tools/sdk/ndk/index.html 에서 파일을 받아 홈폴더에 압축을 풀고 경로설정을 하는 데에서부터 시작한다.
노틸러스에서 내폴더에 다운받은 NDK압축파일을 놓고 압축을 푼다. 그러면 android-ndk-r8d 폴더가 생길 것이다. (뒤에 r8d는 버전이다. 업데이트되면 바뀔수도 있다)
경로 설정을 한다.
터미널을 켜고
gedit ~/.bashrc
파일이 열리면 맨 아래에
export PATH=$PATH:~/adt-bundle-linux-x86_64/sdk/platform-tools
export PATH=$PATH:~/adt-bundle-linux-x86_64/sdk/tools
export PATH=$PATH:~/bin
export PATH=$PATH:~/android-ndk-r8d
ANDROID_NDK_ROOT=~/android-ndk-r8d
ANDROID_SDK_ROOT=~/adt-bundle-linux-x86_64/sdk
형식으로 SDK와 NDK의 경로설정을 해 놓는다. (아마 SDK 경로설정은 이미 되어있을것이라 생각된다)
그리고 이클립스를 켠다.
window-preferences-android-ndk 항목으로 들어가 NDK폴더 경로를 찾아주고 apply를 누른다.
이제 모든 설정이 끝났다.
예제를 테스트 해보자.
먼저 android application project를 하나 생성한다.
이름은 HelloJni로 한다.
생성시 기본적인 항목은 대충 알아서 하고, 패키지 네임은 com.example.hellojni 정도가 적당할 것이고 blank Activity이름을 HelloJni로 생성한다.
HelloJni.java
package com.example.hellojni;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class HelloJni extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this); // 텍스트뷰 객체 tv 생성
tv.setText(stringFromJNI()); // tv에 JNI함수의 결과를 넣음
setContentView(tv); // 화면에 tv를 출력
}
public native String stringFromJNI(); // 네이티브메소드 선언
public native String unimplementedStringFromJNI();
static {
System.loadLibrary("hello-jni"); // libhello-jni.so 로드
}
}
그리고 나면 이제 C언어 소스를 제작해야 한다.
프로젝트매니저에서 프로젝트를 우클릭하면 android tools - add native support 메뉴가 있다.
java소스에서 부른 대로 라이브러리 이름은 hello-jni로 한다.
생성하면 프로젝트내에 jni라는 폴더가 생기고, hello-jni.cpp파일과 Android.mk파일이 보일 것이다.
hello-jni.cpp파일을 우클릭해서 rename으로 hello-jni.c로 바꿔주고, Android.mk 파일을 열어서 마찬가지로 .cpp를 .c로 바꿔준다.
hello-jni.c
#include
#include
jstring
//함수의 이름은 Java_패키지명_클래스명_메소드명 이다.
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
그리고 테스트기기 꽂고 실행하면 자동으로 java, c 소스들의 컴파일 후 링킹까지 해 준다.
폰 화면에
Hello from JNI !
라는 내용이 출력되었으면 제대로 빌드된 것이다.
기본적인 자바 JNI예제와 크게 다를 것이 없다는 점을 알 수 있다.