JEUS에서 JNI 사용 방법에 대해 알아본다.


1. JNI를 사용하여 Native Function을 호출 할 클래스를 작성한다.

package com.jjoo.jni;


public class NativeFunctionCall {

public native int sum(int a, int b);

static{

System.loadLibrary("CustomNativeLibrary");

}


}


2. javah 툴을 사용하여 헤더 파일을 만든다.


3. C 파일 작성을 작성한다.

#include "customNativeLibrary.h"


int main (int argc, char *argv[]) { }


/*

 * Class:     com_jjoo_jni_NativeFunctionCall

 * Method:    sum

 * Signature: (II)I

 */

JNIEXPORT jint JNICALL Java_com_jjoo_jni_NativeFunctionCall_sum (JNIEnv *env, jobject obj, jint a , jint b){

    return a+b;



4. C 파일을 컴파일한다.

System.loadLibrary(String lib) 에서 "test" 라는 파라미터를 넣어줬다면

so 파일명은 libtest.so 가 되어야 한다.

System.loadLibrary("CustomNativeLibrary") 라고 호출하였기 때문에

so 파일 생성시에 -o libCustomNativeLibrary.so 옵션을 주었다.


  4.1. main() 함수가 없을 경우 아래와 같은 컴파일 에러가 발생하여 추가했다.



5. $JEUS_HOME/bin/jeus.properties에 Native Library 경로를 설정한다.

   Native Library는 -Djava.library.path=[path] 에 설정해야 한다.


jeus.properties 파일을 보면 JEUS_LIBPATH 설정 부분이 있고

# set up JEUS_LIBPATH.

JEUS_LIBPATH="${JEUS_HOME}/lib/system:/home/jjoo/native_lib


jeus 파일을 보면 jeus.properties를 실행시킨 뒤 java.library.path에 JEUS_LIBPATH 값을 넣어 기동한다. 

# set JEUS properties

. "${JEUS_HOME}/bin/jeus.properties" 

...

# execute jeus with echo

set -x

"${JAVA_HOME}/bin/java" $VM_OPTION  $SESSION_MEM                            \

    -Xbootclasspath/p:"${JEUS_HOME}/lib/system/extension.jar"               \

    -classpath "${JEUS_HOME}/lib/system/bootstrap.jar"                      \

    -Dsun.rmi.dgc.client.gcInterval=3600000                                 \

    -Dsun.rmi.dgc.server.gcInterval=3600000                                 \

    -Djava.library.path="${JEUS_LIBPATH}"                                \

    -Djava.endorsed.dirs="${JEUS_HOME}/lib/endorsed"                        \

    -Djava.naming.factory.initial=jeus.jndi.JNSContextFactory               \

    -Djava.naming.factory.url.pkgs=jeus.jndi.jns.url                        \

    -Djava.net.preferIPv4Stack=true                                         \

    -Djava.util.logging.config.file="${JEUS_HOME}/bin/logging.properties"   \

    -Djava.util.logging.manager=jeus.util.logging.JeusLogManager            \

    -Djeus.home="${JEUS_HOME}"                                              \

    -Djeus.log.home="${JEUS_HOME}/logs"                                     \

    -Djeus.baseport=${JEUS_BASEPORT}                                        \

    -Djeus.jvm.version=${VM_TYPE}                                           \

    -Djeus.tm.checkReg=true                                                 \

    -Djeus.tool.webadmin.locale.language=${JEUS_LANG}                       \

    -Djeus.net.reuseAddress=true                                            \

    -Djeus.properties.replicate=jeus,sun.rmi,java.util,java.net             \

    ${JAVA_ARGS}                                                            \

    jeus.server.JeusBootstrapper ${BOOT_PARAMETER}


5.1. 만일 so 파일이 로딩되지 않았을 경우에 아래 같은 에러가 확인된다.




6. 마지막으로 HelloJNI.jsp 파일을 만들어 sum 함수를 호출한다.

[jjoo@ftech1 JNITest]$ cat HelloJNI.jsp 

<%@page import="com.jjoo.jni.NativeFunctionCall"%>

<%

NativeFunctionCall nfc = new NativeFunctionCall();

out.print(nfc.sum(1,9));

%> 









Posted by 주똥
,