JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C、C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so【shared object】文件)。
JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程。JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C之间的数据类型映射。从性能上会比JNI技术调用动态链接库要低。
package com.wlb.jna;
import com.sun.jna.Library;
import com.sun.jna.platform.win32.WinNT.HANDLE;
public interface User32 extends Library
{
//打开剪切板
int OpenCliboard (int param);
//获取剪切板数据
HANDLE GetClipboardData(int param);
//清空剪切板
boolean EmptyClipboard();
//关闭剪切板
boolean closeClipboard();
}
package com.wlb.jna;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.win32.StdCallLibrary;
public interface Gdi32 extends StdCallLibrary
{
HANDLE CopyEnhMetaFileA(HANDLE param, String param2);
HANDLE DeleteEnhMetaFile(Handler param);
}
package com.wlb.jna;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinNT.HANDLE;
public class TestJNA
{
public static void main(String[] args)
{
//先将图片拷贝到剪切板
copyPic();
//在C盘生成emf;
String target = "c:\\chart.emf";
User32 user32 = (User32)Native.loadLibrary("user32", User32.class);
//如果方法执行正确,返回非零数字
int open = user32.OpenCliboard(0);
System.out.println(open);
//14指EMF图片类型
//方法执行正确,返回当前句柄,否则返回null
HANDLE getData = user32.GetClipboardData(14);
//方法执行正确,返回当前句柄,否则返回null
Gdi32 gdi32 = (Gdi32)Native.loadLibrary("gdi32",Gdi32.class);
//方法执行正确,返回当前句柄,否则返回null
HANDLE copy = gdi32.CopyEnhMetaFileA(getData, target);
//方法执行正确,返回当前句柄,否则返回null
HANDLE del = gdi32.DeleteEnhMetaFile(copy);
System.out.println(del);
//清空后返回true
boolean empty = user32.EmptyClipboard();
System.out.println(empty);
//关闭后返回true
boolean close = user32.closeClipboard();
System.out.println(close);
}