몇 가지 자바 호출 dll 방식
2695 단어 다중 언어 호출
자바에서 DLL을 호출하는 방법은 여러 가지가 있는데 자주 사용하는 방식은 JNative, JNA, JNI 등이 있다.
JNative 방식으로 dll 호출
JNative는 Java 언어를 DLL로 호출할 수 있는 기술로 JNI를 봉인했다. 일부 독자들은 이런 문제를 가지고 있을 수 있다. JNative는 JNI를 봉인했고 다중 언어로 DLL을 사용했다. 효율이 만족스럽지 못할지 모르겠다. 나는 내가 Jnative를 사용한 경험으로 너에게 알려줄 수 있다. 아니야!왜냐하면 내가 Jnative를 사용하는 것은 대량의 데이터 호출을 처리하는 데 사용되고 실시간 데이터베이스 인터페이스를 기반으로 하는 호출이기 때문이다.실시간 데이터베이스의 데이터 양은 매우 크다.
먼저 JNative를 다운로드하고,
참고: JNative의 압축을 풀고 JNative Cpp.system32 폴더로 dll 복사, libJNativeCpp.so는 linux 플랫폼에서 사용합니다.
코드:package com.tvjody;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.util.Kernel32.SystemTime;
public class Demo {
public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
// Kernel32.dll dll ,Kernel32 :C:\Windows\System32 ,
// GetSystemTime Kernel32.dll .
JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime");
SystemTime systemTime = new SystemTime();
//
nGetSystemTime.setParameter(0, systemTime.getPointer());
nGetSystemTime.invoke();
//
return systemTime.getValueFromPointer();
}
public static void main(String[] args) throws NativeException, IllegalAccessException {
System.err.println(GetSystemTime());
System.exit(0);
}
}
JNA 방식으로 dll 호출
JNA(Java Native Access) 프레임워크는 기원된 Java 프레임워크로 SUN회사가 주도적으로 개발한 고전적인 JNI의 기초 위에 세워진 프레임워크이다.
먼저 JNA를 다운로드하고,
코드:package com.tvjody;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class JNA {
// CLibrary, com.sun.jna.Library
public interface testdll extends Library {
// msvcrt dll ,msvcrt :C:\Windows\System32 ,
testdll Instance = (testdll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
testdll.class);
// printf msvcrt.dll .
void printf(String format, Object... args);
}
public static void main(String[] args) {
// printf
testdll.Instance.printf("yyyyMMdd");
}
}
JNI 호출 dll
현존하는 것이 있다면.dll/.so 파일, 만약 JNI 기술로 호출된다면, 우리는 우선 C 언어로 하나를 써야 한다.dll/.so 공유 라이브러리, SUN이 규정한 데이터 구조를 사용하여 C 언어의 데이터 구조를 대체하고 기존의 dll/so에 발표된 함수를 호출합니다.그리고 자바에 이 어댑터 dll/so를 불러오고 자바native 함수를 dll 함수의 에이전트로 작성합니다.Java에서 로컬 코드를 호출하려면 2단계의 번거로운 절차를 거쳐야 합니다.따라서, 호출 dll/를 작성하려는 Java 프로그래머는 드물다.so 라이브러리의 원본 함수인 자바 프로그램입니다.이것 또한 자바 언어를 클라이언트에서 설명할 수 없게 한다.JNI가 Java의 큰 약점이라고 할 수 있습니다!몇 개의 링크만 제공합시다!
http://blog.sina.com.cn/s/blog_6c3b9ed40100xyl8.html
http://www.open-open.com/home/space-37924-do-blog-id-5681.html
위 소스 코드 다운로드
package com.tvjody;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.util.Kernel32.SystemTime;
public class Demo {
public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
// Kernel32.dll dll ,Kernel32 :C:\Windows\System32 ,
// GetSystemTime Kernel32.dll .
JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime");
SystemTime systemTime = new SystemTime();
//
nGetSystemTime.setParameter(0, systemTime.getPointer());
nGetSystemTime.invoke();
//
return systemTime.getValueFromPointer();
}
public static void main(String[] args) throws NativeException, IllegalAccessException {
System.err.println(GetSystemTime());
System.exit(0);
}
}
package com.tvjody;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class JNA {
// CLibrary, com.sun.jna.Library
public interface testdll extends Library {
// msvcrt dll ,msvcrt :C:\Windows\System32 ,
testdll Instance = (testdll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
testdll.class);
// printf msvcrt.dll .
void printf(String format, Object... args);
}
public static void main(String[] args) {
// printf
testdll.Instance.printf("yyyyMMdd");
}
}