ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

     


    1,2,3,4 (원,투,쓰리,포)

    아티스트
    이하이
    앨범명
    1,2,3,4 (원,투,쓰리,포)
    발매
    2012.10.29
    배경음악다운받기듣기

    '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
© 2018 T-Story. All right reserved.