[size=medium] 通常java自带的调用本地化程序(C/C++)是通过JNI的方式,但是此种方式操作非常不便,为此SUN又开发了另外一套调用本地化程序的方式——JNA(Java Native Access),底层的实现方式是JNI,只是在上层做了一次封装。
目前GNA新的访问入口github上,请猛戳这里[url]https://github.com/twall/jna[/url]
[b]功能简单易用,很强大[/b]
不堪回首的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的一大弱点!
废话少说,接下直接[color=brown]有图[/color][color=blue]有码[/color][color=green]有真相[/color]的告知大家如何方便易用JNA
首先在linux eclipse中建立一个C语言动态链接库([color=red]Shared Library[/color])hello工程,如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0091/6872/719d40f8-9811-390a-bc1b-3cdbd936d714.jpg[/img]
hello工程里面只有一个源文件helloworld.c其内的代码如下:[/size]
[size=medium]通过自动编译生成[color=red]libhello.so[/color]动态库文件[/size]
[size=medium]接下来创建java调用动态库工程hello4j,如下图所示:[/size]
[img]http://dl2.iteye.com/upload/attachment/0091/6878/ef74a291-d30a-3aa1-bec6-09198238283e.jpg[/img]
[size=medium]hello4j只有一个源文件Hello.java,内容如下:[/size]
[size=medium]记得hello4j工程要依赖[color=red]jna.jar[/color]包[/size]
运行Hello.java程序,发现会报错:
[size=medium]那是因为系统找不到libhello.so库文件,当前的解决方案是将[color=red]libhello.so[/color]文件放在[color=red]/usr/lib[/color]下
再次运行,即可达到预期的结果:
[color=red]Hello World![/color][/size]
目前GNA新的访问入口github上,请猛戳这里[url]https://github.com/twall/jna[/url]
[b]功能简单易用,很强大[/b]
不堪回首的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的一大弱点!
废话少说,接下直接[color=brown]有图[/color][color=blue]有码[/color][color=green]有真相[/color]的告知大家如何方便易用JNA
首先在linux eclipse中建立一个C语言动态链接库([color=red]Shared Library[/color])hello工程,如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0091/6872/719d40f8-9811-390a-bc1b-3cdbd936d714.jpg[/img]
hello工程里面只有一个源文件helloworld.c其内的代码如下:[/size]
/*
* helloworld.c
*
* Created on: Nov 29, 2013
* Author: semantic
*/
#include <stdio.h>
void test(){
printf("Hello World!\n");
}
[size=medium]通过自动编译生成[color=red]libhello.so[/color]动态库文件[/size]
[size=medium]接下来创建java调用动态库工程hello4j,如下图所示:[/size]
[img]http://dl2.iteye.com/upload/attachment/0091/6878/ef74a291-d30a-3aa1-bec6-09198238283e.jpg[/img]
[size=medium]hello4j只有一个源文件Hello.java,内容如下:[/size]
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();
}
}
[size=medium]记得hello4j工程要依赖[color=red]jna.jar[/color]包[/size]
运行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.<init>(Library.java:123)
at com.sun.jna.Native.loadLibrary(Native.java:255)
at com.sun.jna.Native.loadLibrary(Native.java:241)
at Hello$Clibrary.<clinit>(Hello.java:13)
at Hello.main(Hello.java:22)
[size=medium]那是因为系统找不到libhello.so库文件,当前的解决方案是将[color=red]libhello.so[/color]文件放在[color=red]/usr/lib[/color]下
再次运行,即可达到预期的结果:
[color=red]Hello World![/color][/size]