JNA, Java Native开发利器

下面的文章由转载而来,java与c++的调用基本思路是这样子,可是结合个人使用经验,在使用jna和jnative的时候须要考虑到jdk的版本,jnative跟jdk1.4的结合可能会有点问题,由于我以前选的是jnative,而咱们的jdk版本是1.4,咱们下载的jnative jar不支持1.4版本,这样才换了jna,庆幸jna支持jdk1.4,特做此说明。 java

-------------------------------------------------------------------------------------------------- c++

简单的来讲,这篇文章就是介绍一个十分好用的Java Native开发工具, JNA。 在Java编程中,大部分时间都不须要理会JNI,可是当你须要调用一个本地的C/C++库的时候,你就不得不考虑若是在Java中调用C库中的接口(dll, so)。这样的状况有不少,好比当你须要访问一个硬件时,而硬件厂商只提供C语言写的驱动和库文件。 刚开始,或许像我同样,大部分人知道Java有一个叫JNI的东西能够作到这一点,还不坏不是么,至少能够实现它。可是JNI的编写至关复杂和拙劣,关键的一点是须要编写C代码,要知道这对于至关一部分Java程序员来讲可不是一个容易的事情。除了你要精通C语言,还要熟悉JNI的知识,包括C的数据类型如何对应到JNI的C数据类型,又如何对应到Java的数据类型,还有不少其余的细节须要注意,好比垃圾回收的问题,还有结构体数据类型对应问题,跨平台问题等等都足以把你搞得头大。不少状况下,只不过是为了调用一个第三方库,不得再也不造出本身的一个库,不得不编写JNI代码和本地代码。我为何不能直接调用本地库代码? 直到有那么一天,某我的告诉你有个叫JNA的东西,就是专门用来解决这个问题的。像下面这个例子这么简单。   git

package com.sun.jna.examples;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {

// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.

public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class);

void printf(String format, Object... args);
}

public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i=0;i < args.length;i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
使用JNA,你甚至不须要不少的文档,只要拿到第三方库的头文件,好比third.h,根据里面的函数定义直接生成Java的代码,几分钟就能够搞定。Java和本地C库的映射,能够根据头文件直接生成,甚至不用开发人员手动编写对应关系。要用哪几个函数,就在Java接口中添加哪几个函数。你能够按照本身想要的方式加载本地库(若是你曾被JNI下面System.loadLibrary那捉摸不定的java.library.path搞得生不如死),JNA还能够作到C结构体和Java类的映射,若是你须要在Java中,向本地方法传递结构体,这就会颇有用:  

public static class SYSTEMTIME extends Structure {
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;
}

void GetSystemTime(SYSTEMTIME result);

相比较与JNI来讲,JNA也有它的缺点,其实JNA是创建与JNI的基础之上的,因此若是对性能要求特别高,那么多花点时间在JNI上面也许是值得的。另外,JNA在Java调用底层C库的时候特别方便,可是反过来,若是想要从C里面调用Java,JNA可能会遇到不小的麻烦,这时候你也许须要转回到JNI. 若是你还对Java的Native开发心有余悸,但愿这篇介绍的JNA的文章能够帮助你跨越JNI开发的这道鸿沟:) 程序员

相关文章
相关标签/搜索