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

[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]

/*
* 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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值