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 에러가 발생한다.