프로그래밍 언어/<Java>

JNI on linux

소혼 2010. 12. 27. 22:28
반응형
Inside Android 책을 보면서 JNI 예제를 따라 해보고 있다.

책에서는 Visual C++로 예제를 실행하고 있어서 리눅스에서 so 만드는 법이 빠져있다.

1. 책의 예제대로 간단한 java파일을 하나 만든다. HelloJNI.java

public class HelloJNI {
native void printHello();
native void printString(String str);

static { System.loadLibrary("hellojni"); }
public static void main(String args[]) {
HelloJNI myJNI = new HelloJNI();
myJNI.printHello();
myJNI.printString("Hello World");
}
}

2. javac로 HelloJNI.java를 컴파일한다.
# javac HelloJNI.java

3. javah로 헤더를 생성한다. (HelloJNI.h가 생성된다.)
# javah HelloJNI

4. hellojni.c 파일을 만든다. (2에서 생성된 header를 include하고 함수의 바디를 구현)
#include "HelloJNI.h"
#include <stdio.h>


JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj)
{
    printf("Hello World\n");
}

JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject obj, jstring string)
{
    const char *str = (*env)->GetStringUTFChars(env, string, 0); 
    printf("Hello World : %s\n", str);
}


5. hellojni.c를 컴파일한다. (생성되는 so 파일명이 libXXX.so가 되어야 한다. XXX는 java 파일에서 load한 이름)
gcc -fPIC -c hellojni.c
gcc -shared -o libhellojni.so hellojni.o

6. LD_LIBRARY_PATH를 건다.
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

7. 실행한다.
java HelloJNI

* 6번과 7번 대신 아래 명령어를 실행해도 된다.
java -Djava.library.path=. HelloJNI


여담) 누군가는 하루 10시간을 회사에서 일하고 휴식을 취하지만, 누군가는 10시간이 넘게 회사에서 일하고 집에서는 미래를 만든다.
동기가 쓴 책을 읽을때보다 후배가 쓴 책을 읽고 있을때 나의 게으름이 더 절실히 와닿는 것 같다.
반응형

'프로그래밍 언어 > <Java>' 카테고리의 다른 글

Sort a HashMap by Value  (0) 2011.08.07
[자바] 날짜, 요일 출력.  (0) 2010.11.06
[자바]일련의 숫자 임의 정렬하기  (0) 2010.07.31
[String]String.format  (0) 2010.06.16
[팁] File 읽어서 파싱하기  (0) 2010.06.10