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技术调用动态链接库要低。
笔者机器中libvirt相关的动态链接库:
lzjun@lzjun-ubuntu:/var/run/libvirt$ ll /usr/lib/libvirt
libvirt/ libvirt-qemu.so.0.9.8 libvirt.so.0.9.8
libvirt-qemu.so.0 libvirt.so.0
实例:(笔者环境:Ubuntu1204、JDK6、gcc)
一:编写动态链接库:(库文件名格式:lib*.so*)
1、编写头文件 #hellworld.h
void test();
2、编写实现文件 #helloworld.c
#include<stdio.h>
void test(){
printf("helloworld\n");
}
3、编译生成动态库,文件名:libhello.so
gcc -fpic -shared -o libhello.so helloworld.c
文件libhello.so生成。(此处还有一步,请看文章结尾处的异常),接下来就可以编写测试文件调用该动态链接库了。
二:编写测试文件
如果是用maven构建项目,非maven项目google之,把jna.jar加入classpath即可,JNA 的包依赖:
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
编写测试类:
import com.sun.jna.Library;
import com.sun.jna.Native;
public class JnaTest {
//继承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();
}
}
#输出“helloworld”
如果抛出如下异常:
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 JnaTest$Clibrary.<clinit>(JnaTest.java:12)
at JnaTest.main(JnaTest.java:22)
那是JVM没法找到动态链接库的路径,此时需要把动态链接库加入系统的/lib目录或修改配置文件:
# pwd >> /etc/ld.so.conf (把动态链接库所在路径加入配置文件中,此处用pwd是因为笔者当前所在目录就是链接库文件所在目录)
# ldconfig
参考:http://blog.csdn.net/laomai/article/details/1510957
分享到:
相关推荐
### JNA 实例详解 #### 一、JNA简介与应用场景 JNA(Java Native Access)是一种能够让Java程序调用本地库(Native Libraries)的技术,它允许开发人员在不编写JNI(Java Native Interface)代码的情况下访问本地...
本实例将详细介绍如何使用JNA调用DLL动态链接库,通过一个超简单的Demo来展示其过程。 首先,我们需要了解JNA的基本工作原理。JNA通过映射Java方法到本地库中的函数,实现了跨语言的通信。在Java中,我们定义一个...
这个实例是关于如何使用JNA来调用DLL(动态链接库)的教程,特别强调了在调用过程中可能出现的中文乱码问题以及如何解决这个问题。 首先,我们需要理解JNA的工作原理。JNA通过提供一个接口定义,让Java代码能够映射...
本实例将深入探讨如何使用JNA调用DLL,并涵盖了各种参数类型,包括基本数据类型、指针、结构体、回调函数、字符串以及数组。 首先,理解JNA的基本工作原理至关重要。JNA通过映射DLL中的函数到Java类的方法来实现...
本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA通过映射Java接口到原生函数来实现与本地代码的交互。这些接口定义了要调用的函数签名,JNA会自动处理参数...
**JNA.jar与实例应用** Java Native Access (JNA) 是Java平台上的一个库,它允许Java代码直接调用本地(操作系统级)函数,而无需编写C代码或使用Java Native Interface (JNI)。JNA.jar是JNA的核心库,包含了JNA的...
NLPIR分词JNA实例,直接导入就可以使用。
针对现如今最新版JNA读取本地window event的实例 供参考
例如,如果你需要调用Windows API中的某个函数,你可以创建一个接口,然后通过JNA的Platform类加载相应的库,并实例化该接口,就可以直接调用本地函数了。 使用JNA,你可以执行以下操作: 1. 调用操作系统API:比如...
**JNA(Java Native Access)** 是Java平台上的一个库,允许Java应用程序直接调用操作系统级别的函数,无需编写JNI(Java Native Interface)代码。JNA提供了更简单的接口来与本地库交互,使得开发者可以轻松地访问...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地库函数,而无需编写C语言的JNI(Java Native Interface)代码。JNA通过映射Java方法到本地库中的函数,实现了Java与C...
在你提供的压缩包"jna整合包-jna4.5.0+jna4.0.0.rar"中,包含了两个版本的JNA库:jna-4.0.0.jar和jna-4.5.0.jar。这两个版本的差异主要体现在功能的完善和性能的优化上。JNA 4.5.0是较新的版本,相比4.0.0,它可能...
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
在实际开发中,导入JNA和jna-platform的jar包后,可以通过定义Java类来映射C/C++的结构体,通过Interface来定义要调用的函数,然后实例化并调用这些函数。例如: ```java import com.sun.jna.Library; import ...
然后,通过`NativeLibrary.getInstance()`加载相应的库,并通过`Interface.newInstance()`创建接口实例,就可以调用原生函数了。JNA会自动处理类型映射和函数调用,极大地简化了跨平台的原生调用过程。 总结来说,...
然后,我们使用`Native.load`加载`kernel32.dll`库,并实例化`Kernel32`接口。 总的来说,JNA-5.7.0和jna-platform-5.7.0是Java开发中非常实用的工具,它们极大地降低了与本地系统交互的复杂性,使得Java开发者可以...
- **实例化**:通过`Native.loadLibrary`方法加载对应的本机库,并创建接口实例。 - **方法调用**:定义了一个`printf`方法,用于调用本机库中的`printf`函数。 通过以上知识点的总结,我们可以了解到JNA如何简化了...
在"jna实例代码"中,我们将深入探讨如何使用JNA进行本地资源的调用,包括对动态库的操作、句柄的管理以及与Java指针的交互。 首先,JNA的核心在于`com.sun.jna.Library`接口,它是所有本地函数的抽象。开发者需要...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写C/C++的桥接代码。JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地...
jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包 JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态...