본문 바로가기
Programming/Java

[java] How To Call Native (DLL) Code From Java Using JNI

by NAMP 2016. 5. 11.

[java] How To Call Native (DLL) Code From Java Using JNI

이클립스에서 자바 프로젝트를 만든다.

package com.test;

public class HelloWorld {

	private native void print();
	
	static {
		System.loadLibrary("lib/com_test_HelloWorld");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new HelloWorld().print();
	}
}

lib/com_test_HelloWorld 는 생성한 dll 을 넣은 위치와 파일명이다.

class 파일에 대해서 javah 를 실행한다.

path에 javah 가 없어서, HelloWorld.class 파일을 복사 했다.
javah 는 C:\Program Files\Java\jdk1.8.0_73\bin 에 있다. 이곳에 패키지를 그대로 복사한다.

C:\Program Files\Java\jdk1.8.0_73\bin\com\test

javah 를 실행한다.

C:\Program Files\Java\jdk1.8.0_73\bin>javah com.test.HelloWorld

class 파일만 복사해서 실행하게 되면 class 파일을 찾지 못하는 에러가 발생한다.

C:\Program Files\Java\jdk1.8.0_73\bin>javah com.test.HelloWorld
Error: Could not find class file for 'com.test.HelloWorld'.

visual studio 에서 dll 프로젝트를 생성한다.

위에서 생성한 com_test_HelloWorld.h 헤더파일을 추가한다.

https://support.microsoft.com/en-us/kb/222092

JNIEXPORT 에서 에러가 발생하면 포함 디렉토리를 추가한다.

cpp 파일을 작성한다.

#include <jni.h>
#include "com_test_HelloWorld.h"

JNIEXPORT void JNICALL Java_com_test_HelloWorld_print(JNIEnv *env, jobject jobj)
{
	printf("Hello World!\n");
	return;
}

빌드한 dll 파일을 자바프로젝트의 lib 폴더에 넣는다.

Can’t load IA 32-bit .dll on a AMD 64-bit platform

http://huammmm1.tistory.com/445

이 문제의 원인은 dll파일은 32bit인데 사용하는 jvm이 64bit이기 때문이다.

해결 방법

  1. dll파일을 64비트로 다시 빌드한다. (참고 : http://huammmm1.tistory.com/444)
  2. JVM을 32비트로 맞춘다.

참고

tags: java, native, jni, eclipse, dll, call, cpp

'Programming > Java' 카테고리의 다른 글

Big Data 플랫폼 구현기술의 이해  (0) 2018.06.01
한글상태일 경우 글자수 찾기  (0) 2015.05.19
측정소와 수온  (0) 2015.02.01
객체 지향의 핵심 5가지  (0) 2014.04.13
1에서 10000까지에서 8이 몇개  (0) 2012.06.30

댓글