[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이기 때문이다.
해결 방법
- dll파일을 64비트로 다시 빌드한다. (참고 : http://huammmm1.tistory.com/444)
- JVM을 32비트로 맞춘다.
참고
- http://landsnail.tistory.com/entry/JNI-자바로-DLL-로드-하기
- http://huammmm1.tistory.com/445
- http://huammmm1.tistory.com/444
- https://support.microsoft.com/en-us/kb/222092
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 |
댓글