Linux下java调用本地化程序(C/C++)——JNA

阅读更多
    通常java自带的调用本地化程序(C/C++)是通过JNI的方式,但是此种方式操作非常不便,为此SUN又开发了另外一套调用本地化程序的方式——JNA(Java Native Access),底层的实现方式是JNI,只是在上层做了一次封装。

    目前GNA新的访问入口github上,请猛戳这里https://github.com/twall/jna

    功能简单易用,很强大
    不堪回首的JNI我们知道,使用JNI调用.dll/.so共享类库是非常非常麻烦和痛苦的。
如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的  dll/so中公布的函数。

然后再在Java中载入这个适配器dll/so,再编写Java   native函数作为dll中函数的代理。

经过2个繁琐的步骤才能在Java中调用本地代码。
因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点!

废话少说,接下直接有图有码有真相的告知大家如何方便易用JNA

首先在linux eclipse中建立一个C语言动态链接库(Shared Library)hello工程,如下图所示:
Linux下java调用本地化程序(C/C++)——JNA_第1张图片
hello工程里面只有一个源文件helloworld.c其内的代码如下:

/*
 * helloworld.c
 *
 *  Created on: Nov 29, 2013
 *      Author: semantic
 */

#include 

void test(){
	printf("Hello World!\n");
}


通过自动编译生成libhello.so动态库文件

接下来创建java调用动态库工程hello4j,如下图所示:
Linux下java调用本地化程序(C/C++)——JNA_第2张图片

hello4j只有一个源文件Hello.java,内容如下:
import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * @author semantic
 * 
 */
public class Hello {

	// 继承Library,用于加载库文件
	public interface Clibrary extends Library {
		// 加载libhello.so链接库
		Clibrary INSTANTCE = (Clibrary) Native.loadLibrary("hello",
				Clibrary.class);

		// 此方法为链接库中的方法
		void test();
	}

	public static void main(String[] args) {
		// 调用
		Clibrary.INSTANTCE.test();
	}

}


记得hello4j工程要依赖jna.jar

运行Hello.java程序,发现会报错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'hello': libhello.so: cannot open shared object file: No such file or directory
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:145)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:188)
at com.sun.jna.Library$Handler.(Library.java:123)
at com.sun.jna.Native.loadLibrary(Native.java:255)
at com.sun.jna.Native.loadLibrary(Native.java:241)
at Hello$Clibrary.(Hello.java:13)
at Hello.main(Hello.java:22)



那是因为系统找不到libhello.so库文件,当前的解决方案是将libhello.so文件放在/usr/lib
再次运行,即可达到预期的结果:
Hello World!
  • Linux下java调用本地化程序(C/C++)——JNA_第3张图片
  • 大小: 32.4 KB
  • Linux下java调用本地化程序(C/C++)——JNA_第4张图片
  • 大小: 45.8 KB
  • 查看图片附件

你可能感兴趣的:(Linux下java调用本地化程序(C/C++)——JNA)