본문 바로가기

IT for developer/Java

JNI C 라이브러리 생성

2004년에 네이버 블러그에 작성했던 것~

1. 자바 파일 생성

// ----- JNIWrapper.java 시작--------------

package inking;

public class JNIWrapper {

 // Native Method 선언
 public native String encrypt(String src);
 
 // Native 라이브러리 로드
 static {

  System.loadLibrary("Encoding");
 }
}

// ----- JNIWrapper.java 끝----------------

2. 자바 컴파일

javac -d . JNIWrapper.java

3. C 헤더 파일 생성

javah -jni inking.JNIWrapper

4. C소스 수정

헤더 파일을 참조 하여 Wrapper 함수 생성한다.

여기에서 중요한것은 JNIWrapper.h 파일에서 선언된 함수와 같은 형태로 정의하여야 한다.

그것이 틀리면 실행할 때 함수를 찾지 못해서 java.lang.UnsatisfiedLinkError 에러가 발생한다.

JNIEXPORT jstring JNICALL Java_inking_Encoding_encrypt(JNIEnv * env, jobject obj, jstring src) {

}

C타입과 JNI 타입 매핑이 필요하다.

 jboolean iscopy;
 char enc_pwd[256];
 int size;
 char * szEncrypt = (*env)->GetStringUTFChars(env, src, &iscopy); // JNI --> C 타입 변환
 memset (enc_pwd, 0x00, 256) ;
 size = strlen(szEncrypt);
 Encrypt(szEncrypt, size, enc_pwd); // C 함수 호출
    return (*env)->NewStringUTF(env, enc_pwd);  // C--> JNI 타입 변환


5. Native Library 생성

유닉스/리눅스에서 gcc 이용 (include 헤더 파일의 위치는 환경에 따라 변경 된다. )
gcc -shared -I/usr/local/java/include -I/usr/local/java/include/linux encrypt.c -o libEncoding.so

윈도우에서 cygwin 설치 후 gcc 이용
 gcc  -mno-cygwin  -IC:\j2sdk1.4.2_03\include -IC:\j2sdk1.4.2_03\include\win32 encrypt.c -Wl,--add-stdcall-alias -shared -o Encoding.dll
 
6. 설치

유닉스/리눅스에서 
 libEncoding.so를 java.library.path로 지정된곳에 복사
윈도우 에서
 %Path%로 잡혀 있는 곳에 복사 한다.

이 과정을 제대로 하지 않으면 loadLibrary()때 라이브러리를 찾지 못해서 java.lang.UnsatisfiedLinkError 에러가 발생한다.