티스토리 뷰

Mobile/Android

[NDK] 이클립스를 이용한 build

out of coding 2014. 3. 28. 10:25
성공하기 전까지 완전 개고생을 한것 같다.

 

이전에 인터넷에서 나와 있는 녀석들은 이클립스를 이용하여 개발된 버전들이 아니라서, 그냥 cygwin에서 쳐서 해결을 하였던 부분들이 많았음.

그래도 이제 좀 편해졌으니 다행이긴 하지만...

NDK 다운로드 등에 대한 부분은 저는 설명을 따로 하지는 않겠음.

1. Java Class File 만들기

다들 아시겠지만... C파일과 Interface 역활을 하여줄 Class 파일이 존재하여야 한다.

그렇게 어렵지는 않으니 하나 하나 하다보면 빌드완성을 보게 될것임.

다음과 같이 작성하도록 함.

public class NativeCall
{
	static
	{
		// {project-path}/libs/armeabi/libhellojni_lib.so 파일을 읽어들입니다.
		System.loadLibrary("hellojni_lib");
	}
	
	public native String getJNIMessage(); // String형식으로 데이터를 가져옴
	public native int add(int a, int b); // 메소드 이름처럼 두숫자를 더해서 리턴
}


2. Java Class File로 jni Header File(.h) 만들기

위에서 Java Class파일을 만들었기 때문에, 빌드를 한번 해주게 된다면 {project-path}/bin/classes/ 폴더 아래에 자신이 만든 package name 아래에 .class파일들이 슬며시 들어가 있습니다. 이번 작업이 안된다면, 꼭 Clean이나 Build를 한번 해주길 바람. 또한 javah 관련하여서, 물어보지 말길 바람. 안드로이드 개발 작업하면서 path를 지정안해둔것은 개발 안하겠다는 소리와 같으므로...


C:{project-path}/bin>javah -classpath ./classes/ -jni com.example.hellojni.NativeCall


다르게는 이렇게 하셔도 됩니다.


C:{project-path}/bin/classes>javah -jni com.example.hellojni.NativeCall


위와 같이 저는 package name이 com.example.hellojni입니다. 물론 기본 패키지명 아래에 Java Class를 만들었고요.


다른점은 .h파일이 생성되는 위치라고 생각하시면 됩니다. 자신이 작업한 폴더에 파일이 생성되겠죠?


이 생성된 파일을 다음의 위치로 옮깁니다.


{project-path}/jni/


몰론 처음에는 존재하지 않는 폴더입니다.

탐색기에서 작업을 하셔서 옮기시면 손쉽게 옮기시리라 믿습니다.


이렇게 옮겼는데, 이클립스에서 파일이 존재하지 않는다고 생각되시면, 프로젝트를 클릭하시고, F5를 눌러주시기 바랍니다. 새로고침.


3. .c 파일 만들기

jni가 C로 만든 녀석들을 호출하는것은 당연히 알고 있으시리라고 믿습니다. 그래서 빌드를 할수 있도로 C파일을 작업하여 줍니다. 기본적으로 현재 {project-path}/jni/에 존재하는 h파일에 대해서, 작성을 하여 주면 되는데요.


/jni/위에 마우스 오른쪽 클릭 > NewFile > 만들 파일명

위에 저희는 hellojni_lib로 사용을 하기로 하였죠? 통일성을 위해서, hellojni_lib.c로 지정하여 줍니다.


그리고 다음을 추가하여 줍니다.


#include "com_example_hellojni_NativeCall.h"

JNIEXPORT jstring JNICALL Java_com_example_hellojni_NativeCall_getJNIMessage(JNIEnv *env, jobject obj)
{
	return (*env)->NewStringUTF(env, "Hello JNI!");
}

JNIEXPORT jint JNICALL Java_com_example_hellojni_NativeCall_add(JNIEnv *env, jobject obj, jint a, jint b)
{
	return a + b;
}
분명히 위와 같이 하면 안된다고 말씀하시는 분들이 있으실것 같아서, 설명을 드리자면...
저희가 저위에서 Java Class를 만들고, 그 아래에서 .h파일을 만들었습니다. 그 header 파일 안에 함수원형이 존재하게 되는데요. 다음과 같습니다.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_hellojni_NativeCall */

#ifndef _Included_com_example_hellojni_NativeCall
#define _Included_com_example_hellojni_NativeCall
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_hellojni_NativeCall
 * Method:    printFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellojni_NativeCall_getJNIMessage
  (JNIEnv *, jobject);

/*
 * Class:     com_example_hellojni_NativeCall
 * Method:    Add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_hellojni_NativeCall_add
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif
자... 위에서 저는 생성된 원형을 가져와서 파라메터의 이름만 정의를 하여 주었습니다. JNI에 대한 심도 깊은 부분은 저도 공부를 하고 있는지라... 함수는 잘 모릅니다. 질문하셔도 잘 모릅니다. 아무래도 저 위에 부분이 기본적인듯. 문자 만들기와 머 그런정도... 나머지 문법은 C++을 따르기 때문에 그냥 하시면 됩니다.

4. Android.mk 파일 생성
/jni/에 파일을 하나 더 생성하도록 합니다.
Android.mk 파일입니다. 다음과 같이 타이핑하여 줍니다.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hellojni_lib
LOCAL_SRC_FILES := hellojni_lib.c

include $(BUILD_SHARED_LIBRARY)
일단 이렇게 까지 합니다. 다른 분들은 cygwin에서 ndk-build를 하면 된다고 하는데, 저랑 안맞나 봅니다. 정말 잘 안되서... (사실적으로 폴더 변경등을 하여서 적용하면 될것 같은데...) 이것보다 더 쉬운 방법을 찾아 나섰습니다.


5. Eclipse NDK 설정

프로젝트명에 마우스 올리시고, 프로젝트 설정으로 이동을 합니다. 단축키 Alt + Enter

탭에서 Builders를 선택하고, New를 선택하여 주세요.

그렇게 되면, type을 물어보는데. Program을 선택하여 주도록 합니다.

그리고 다음과 같이 설정하여 주도록 합니다.


첫번째 탭



두번째 탭




세번째 탭





이렇게 하시고, 실행을 하시거나, Clean을 누르게 되면, ndk-build.cmd가 자동으로 실행이 되며, 빌드가 자동으로 됩니다.

터미널에 저런식이 아니고, 빨갛게 나오게 된다면, 잘못하신겁니다.



끝.

'Mobile > Android' 카테고리의 다른 글

ADB Connection Error  (6) 2014.07.22
안드로이드 프로그래밍 성능개선  (0) 2014.07.05
[Android]adb - Touch Event  (0) 2014.03.20
monkey test  (0) 2014.03.20
NDK 개발환경 구축하기 (이클립스 + Cygwin)  (0) 2014.03.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
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 31
글 보관함