본문 바로가기

TroubleShooting/JNI

HelloWorld jni 테스트 in linux

728x90

- 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