NDK를 사용할 시 ndk-build를 이클립스에서 편하게 할 수 있는 방법에 대해서 알아보도록 하겠다.

NDK-build를 하여 .so파일을 생성할 때 cmd창이나 cygwin 터미널을 이용하지 않고 이클립스에서 편하게 할 수 있다.


먼저 생성한 프로젝트의 [Properties] -> [Builders] -> [New] 를 선택한다.



Program 선택


이름은 NDK_Builder로 하였다. 

Location에는 Browse File System을 선택하여 ndk-build가 있는 위치를 지정해준다.

Working Directory는 현재 프로젝트의 위치를 지정해주면 되는데 Browse Workspace를 선택하여 해당 프로젝트를 선택해준다.


다음은 같은 창에서 Refresh를 선택하고 아래 그림과 같은 순서로 선택한다. 3번을 선택하면 새 창이 뜨는데 해당 프로젝트 파일의 jni 폴더를 선택해 준다.


다음은 Build Options로 넘어가겠다. 1번은 선택사항이다. 자동으로 빌드를 하는건데 컴퓨터가 느려지길 원하지 않는다면 선택을 하지 않아도 된다. 1번을 제외한 나머지 항목은 필수로 선택을 한다. 여기서는 해당 프로젝트의libs 폴더를 선택한다. 


설정이 완료 되었다. 이제 프로젝트를 빌드해보자.


콘솔창에 다음과 같이 나왔다면 빌드에 성공한것이다.


.c 혹은 .cpp파일의 내용이 변경되었을 경우는 [Project] -> [Clean] 에서 해당 프로젝트만 Clean을 해주고 다시 디버깅을 하면 된다.


이제 cmd창에 입력할 필요 없이 이클립스에서 clean -> Debug로 간단하게 ndk build를 할 수 있다.

하지만 이후에 다른 프로젝트에서 똑같은 방법으로 했을 경우 이름이 중복된다는 경고를 볼 수 있다. 그럴때는 Builder의 이름을 NDK_Builder(2) 이런식으로 바꿔주도록 하자. 왜 굳이 따로 또 만들어야 되는지는 모르겠다.. 


이 문제를 해결할 방법을 아시는분은 알려주세요~!^^



NDK를 이용한 기본 예제이다. 간단한 프로그래밍은 기본예제의 변형으로 가능할 것이다. 더 깊은 내용은 나중에 포스팅 하도록 하겠다.


NDK 설치 완료후 제대로 설치가 되었는지 이 예제를 통해서 확인해보길 바란다. 먼저 프로젝트를 하나 생성한다. 프로젝트명은 HelloJNI로 하였다.


프로젝트 생성후 jni라는 이름의 폴더를 하나 생성한다. 이 폴더안에 2개의 파일을 생성할 예정이다.

2개의 파일 이름은 Android.mkhello-jni.c 이다.


jni폴더 생성후 [마우스 오른쪽 클릭] -> [New] -> [File] 을 눌러 파일을 생성한다.




위의 그림의 방식처럼 hello-jni.c 와 Android.mk 파일을 만들었다면 두 파일에 내용을 넣는다. 먼저 hello-jni.c 파일부터 내용을 넣겟다.


hello-jni.c

#include <string.h>
#include <jni.h>

jstring Java_tjssm_hellojni_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
{

    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

NDK 설치를 확인하기 위한 간단한 예제이기 때문에 자세한 설명은 생략하도록 하겠다. 

여기서 주의할 점은 jstring Java_tjssm_hellojni_MainActivity_stringFromJNI()이다.

jstring은 return 타입이고 그다음은 Java_패키지명1_패키지명2_class명_class에서만든메소드명() 이다.


ex) return타입이 jstring 이고 패키지명이 tjssm.hellojni이고 class명이 MainActivity이고, class에 만들어 놓은 메소드명이 stringFromJNI 이기때문에jstring Java_tjssm_hellojni_MainActivity_stringFromJNI() 이라고 쓴다.


여기서 주의할 점은 패키지명이나 class명에 '_'기호가 들어갈 경우 에러가 난다는 것이다. ndk를 이용한 프로그래밍에서는 '_'기호를 넣지 않도록 한다.


다음은 Android.mk 파일에 내용을 넣겠다.


Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE 은 c파일의 이름

LOCAL_SRC_FILES 에는 c파일의 이름에 .c를 붙여주면 된다.


다음은 JAVA소스이다. jni를 호출하는 MainActivity의 소스이다.


MainActivity.java

public class MainActivity extends Activity {
	
	private TextView tv;
	
	static {
		System.loadLibrary("hello-jni");
	}
	
	public native String stringFromJNI();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		tv = (TextView) findViewById(R.id.tv_result);
		tv.setText(stringFromJNI());
	}
}

System.loadLibrary에 이전에 만들었던 c파일의 이름인 hello-jni를 넣어준다. 

public native String stringFromJNI() 라는 메소드가 jni와 연결된다.

return 타입이 String 이므로 이전에 작성했던 hello-jni로부터 String을 return 받아 tv라는 TextView로 값이 전달된다.


위와 같이 소스를 작성하였다면 ndk-build를 실행한다. cygwin 폴더안의 android-ndk폴더를 환경변수로 등록을 하였다면 cmd 창을 실행하여 현재 작성한 프로젝트 파일의 경로로 이동한다. 그후에 ndk-build라는 명령어를 입력하면 현재 프로젝트의 libs->armeabi 라는 폴더가 생기며 폴더안에 파일이 생성되어 있을것이다.


이제 이 프로젝트를 실행시키면 다음과 같은 결과를 얻을 수 있다.



매번 cmd창을 이용하여 ndk build를 할 수는 없으니 다음에는 이클립스에서 ndk build하는 방법을 알아보도록 하겠다.



2014/01/27 - [Programming/안드로이드] - [안드로이드] Eclipse에서 NDK-build 하기



+ Recent posts