- HelloWorld.java 작성
// HelloWorld.java
//
import java.io.*;
public class HelloWorld {
public native void printMessage();
void init() {
System.loadLibrary("HelloWorld");
}
public static void main (String args[]) {
HelloWorld hello = new HelloWorld();
hello.init();
hello.printMessage();
}
}
- HelloWorld 컴파일
$ javac HelloWorld.java
- HelloWorld.h 헤더파일 생성
$ javah -jni HelloWorld
- 헤더파일 확인
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: printMessage
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_printMessage
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- HelloWorld.c 작성
#include "HelloWorld.h"
#include <stdio.h>
/*
* Class: HelloWorld
* Method: printMessage
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_printMessage(JNIEnv *env, jobject jobj)
{
printf("Hello World!!!\n");
return;
}
- libHelloWorld.so 생성(64bit 머신)
$ gcc -o libHelloWorld.so -shared -I$JAVA_HOME/include -I$JAVA_HOME/include/linux HelloWorld.c -fPIC
- HelloWorld 실행
$ java HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at HelloWorld.init(HelloWorld.java:7)
at HelloWorld.main(HelloWorld.java:11)
- java.library.path 확인. env 프로그램은 링크 참조
$ java env
java.class.path:.
java.ext.dirs:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
java.library.path:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
path.separator::
- java.library.path 에 해당하는 디렉토리에 libHelloWorld.so 를 복사해도 동일 에러 메시지가 발생함. 다음과 같이 so 파일이 있는 LD_LIBRARARY_PATH 를 확인해야 된다.
$ export LD_LIBRARY_PATH=`pwd`
$ java HelloWorld
Hello World!!!
참고
// env.java
//
import java.io.*;
// discovering system properties relevant to the classpath
import java.util.Properties;
public class env {
public static void main(String args[]) {
// the classpath
System.out.print("java.class.path:");
System.out.println(System.getProperty("java.class.path"));
// extension directories whose jars are included on the classpath
System.out.print("java.ext.dirs:");
System.out.println(System.getProperty("java.ext.dirs"));
// low level classpath, includes system jars
System.out.print("java.library.path:");
System.out.println(System.getProperty("java.library.path"));
// character to separate (not terminate!) entries on the classpath, ; for Windows : for unix.
System.out.print("path.separator:");
System.out.println(System.getProperty("path.separator"));
}
}
참조
http://stuf.ro/calling-c-code-from-java-using-jni/
http://www.slickdev.com/2009/05/05/java-jni-unsatisfied-link-error-in-library-path/
http://mindprod.com/jgloss/runerrormessages.html#UNSATISFIEDLINKERROR
'Engineering > JNI' 카테고리의 다른 글
jni 로 작성한 c 파일에서 "request for member in something not a structure or union" 컴파일 오류가 날때 (0) | 2012.07.24 |
---|