-
[JNI] 자바로 DLL 로드 하기.Developer/Java 2012. 11. 2. 14:14
자바에서는 JNI를 통하여 C코드를 사용할 수 있다.
주의 할점 경로 및 자바 헤더 파일 생성 과정
아래의 예를 들어 보자
먼저
자바로 C 코드의 함수명을 호출할
메소드를 만든다
package com.test.util
public class loaddll
{
public native void a();
public native int b(String str);
public native String c(int integer);
}
여기서 주의 할점은 package 명이다.
이 패키지명은 C코드와 통신하기 위한 헤더파일을 생성시 매우 중요 하다.
자 그럼 컴파일을 해보자
자바 프로젝트가 있는 root 디렉토리 즉 src 폴더에 가서
CMD 창을 열고
1. javac com.test.util.loaddll.java
2. javah -jni com\test\util\loaddll
하면 클래스 파일인
loaddll.class 파일과
헤더 파일인
com_test_util_loaddll.h 이란 파일이 생성 된다
위 파일을
C 프로젝트에서 로드할 헤더에 포함시켜준다.
그리고 C프로젝트에선 jni를 이용할 수 있게
아래의 경로 처럼 include 경로를 visual c++ 디렉토리로 추가해준다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <jni.h>
#include "com_test_util_loaddll.h"JNIEXPORT void JNICALL Java_com_test_util_loaddll_a(JNIEnv *env, jobject obj)
{
}
JNIEXPORT jint JNICALL Java_com_test_util_loaddll_b(JNIEnv *env, jobject obj, jstring msg)
{
}
JNIEXPORT jstring JNICALL Java_com_test_util_loaddll_c(JNIEnv *env, jobject obj, jint inte)
{
}해서 위와 같이 코드를 작성 했으면
dll을 파일 생성
한다..
자 이제 자바 프로젝트로 돌아가서 테스트 코드를 작성 할때 유의할점!!
package com.test;import com.test.util.loaddll;
public class LoadDLLTest
{
public static void main(String[] args)
{
loaddll module = new loaddll();module.a();
...
..
}
}
package com.test.util;public class loaddll
{
public native void a();
public native int b(String str);
public native String c(int integer);
public loaddll()
{
System.loadBinary("lib/loaddll");
<!-- 이거나
System.load("절대 경로 ");
}
}
패키지가 중요 하다. dll 헤더 파일과 동일한 패키지 에 위치한 클래스에서 로드 해야 하며.
그렇지 않을경우 경로를 찾을 수 없는다는 오류가 발생한다 .
두번째. dll명과 클래스 명은 같게 해주는 것이 좋다.
세번째 절대경로 확장자에는 c:\loaddll.dll 을 붙이지만
loadbinary 일경우에는 .dll 을 붙이지 않는다.
중요 참고 사이트
http://aploit.egloos.com/4937154
http://code.google.com/p/theyard/source/detail?r=168
'Developer > Java' 카테고리의 다른 글
[Java] 리플렉션 (Reflection) (0) 2013.03.13 [Java] JVM 구조 (0) 2013.03.13 [Java] Multi-Thread - 채팅 (0) 2013.03.13 [Java] Iterator 와 Enumeration (0) 2013.03.13 자바에서 파일 입출력 할때 기억하자 (0) 2012.09.27