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)); %> |