JNA全称Java Native Access,是一个建立在经典的JNI技术之上的Java开源框架(https://github.com/twall/jna)。JNA提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。
JNA包:
https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/4.0.0/jna-4.0.0.jar
JNA在线帮助文档:http://twall.github.io/jna/4.0/javadoc/
JNA入门示例:https://github.com/twall/jna/blob/master/www/GettingStarted.md
1,dll和so是C函数的集合和容器,这与Java中的接口概念吻合,所以JNA把dll文件和so文件看成一个个接口。在JNA中定义一个接口就是相当于了定义一个DLL/SO文件的描述文件,该接口代表了动态链接库中发布的所有函数。而且,对于程序不需要的函数,可以不在接口中声明。
2,JNA定义的接口一般继承com.sun.jna.Library接口,如果dll文件中的函数是以stdcall方式输出函数,那么,该接口就应该继承com.sun.jna.win32.StdCallLibrary接口。
3,Jna难点:编程语言之间的数据类型不一致。
Java和C的数据类型对照表
Java 类型 |
C 类型 |
原生表现 |
boolean |
int |
32位整数 (可定制) |
byte |
char |
8位整数 |
char |
wchar_t |
平台依赖 |
short |
short |
16位整数 |
int |
int |
32位整数 |
long |
long long, __int64 |
64位整数 |
float |
float |
32位浮点数 |
double |
double |
64位浮点数 |
Buffer/Pointer |
pointer |
平台依赖(32或 64位指针) |
<T>[] (基本类型的数组) |
pointer/array |
32或 64位指针(参数/返回值) 邻接内存(结构体成员) |
String |
char* |
/0结束的数组 (native encoding or jna.encoding) |
WString |
wchar_t* |
/0结束的数组(unicode) |
String[] |
char** |
/0结束的数组的数组 |
WString[] |
wchar_t** |
/0结束的宽字符数组的数组 |
Structure |
struct*/struct |
指向结构体的指针 (参数或返回值) (或者明确指定是结构体指针) |
Union |
union |
等同于结构体 |
Structure[] |
struct[] |
结构体的数组,邻接内存 |
Callback |
<T> (*fp)() |
Java函数指针或原生函数指针 |
NativeMapped |
varies |
依赖于定义 |
NativeLong |
long |
平台依赖(32或64位整数) |
PointerType |
pointer |
和 Pointer相同 |
4,简单使用示例:
import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; interface HelloInter extends Library{ int toupper(int ch); double pow(double x,double y); void printf(String format,Object... args); } public class HelloWorld { public static void main(String [] args){ HelloInter INSTANCE = (HelloInter)Native.loadLibrary( Platform.isWindows()?"msvcrt":"c", HelloInter.class); INSTANCE.printf("Hello, World\n"); String [] strs = new String[]{"芙蓉","如花","凤姐"}; for (int i=0;i < strs.length;i++) { INSTANCE.printf("人物 %d: %s\n", i, strs[i]); } System.out.println("pow(2d,3d)=="+INSTANCE.pow(2d, 3d)); System.out.println("toupper('a')=="+(char)INSTANCE.toupper((int)'a')); } }
运行结果:
pow(2d,3d)==8.0 toupper('a')==A Hello, World 人物 0: 芙蓉 人物 1: 如花 人物 2: 凤姐
5,示例说明:
HelloInter接口中定义的3个函数全是C语言函数库中的函数,其定义格式如下:
int toupper(int ch) double pow( double x, double y ) int printf(const char* format, ...)
C语言函数库中有很多个函数,但是我们只用到了这3个函数,所以其他的函数不需要声明在接口中。
注意:Java接口中的参数类型和C语言参数类型之间的对应关系(见第3条,对照表)。
6,结构体参数和结构体指针。
(1)Structure子类中的公共字段的顺序,必须和C语言中的结构体的顺序保持一致,否则会出错。
(2)Structure的使用参见:http://www.doc88.com/p-31975835542.html
注意:跨平台调用函数会影响系统性能,应尽量使用基本、简单的数据类型,而且,尽量少跨语言、跨平台传递数据。
参考文章:
深入浅出JNA—快速调用原生函数:http://www.doc88.com/p-31975835542.html
JNA—JNI终结者: http://blog.csdn.net/shendl/article/details/3589676
JNA的使用:http://xbgd.iteye.com/blog/1044864
深入理解JNA—模拟C语言结构体:http://blog.csdn.net/shendl/article/details/3599849
相关推荐
#### 一、JNA简介 JNA(Java Native Access)是一个基于经典JNI技术的Java开源框架,它允许Java应用程序动态地访问本机库,例如Windows系统的.dll文件,而无需编写任何JNI或本机代码。通过在Java接口中描述目标本...
海康威视 JNA调用DLL的方法 为了方便java调用c++接口 去调用录像下载等相应的功能
#### 一、JNA简介与应用场景 JNA(Java Native Access)是一种能够让Java程序调用本地库(Native Libraries)的技术,它允许开发人员在不编写JNI(Java Native Interface)代码的情况下访问本地库。JNA通过反射机制...
#### 知识点一:JNA简介与原理 JNA(Java Native Access)是一种允许Java程序直接调用本机DLL或共享库中的函数的框架。它无需编写JNI(Java Native Interface)代码,使得开发人员能够轻松地在Java应用程序中集成...
1. **JNA简介** - JNA是一种轻量级的框架,通过动态映射本地函数到Java方法,使得Java可以直接调用C/C++等本地库。 - 它通过提供一个接口定义层,使得开发者可以使用Java定义本地函数原型,而无需编写JNI层的复杂...
### JNA简介 JNA提供了一种方便的机制,使得Java程序可以无缝地访问本地库中的函数和数据结构。它的主要优点是减少了JNI的复杂性,同时也避免了生成和管理C头文件、实现文件以及编译原生代码的过程。 ### 使用JNA...
1. **JNA简介** JNA 是一个Java库,它允许Java应用程序直接访问本地库中的函数和数据,而无需编写JNI代码或重新编译任何代码。JNA通过映射Java方法到本地函数来实现这一功能,它使用Java对象来传递参数,并自动处理...
【JNA简介】 JNA提供了一种高级接口,它允许Java程序直接映射到本地库的函数和数据结构,无需编写JNI代码。JNA的工作原理是通过映射Java类和方法到本地函数,然后在运行时动态地加载并调用这些函数。JNA库包括了Java...
- JNA简介:JNA是一种开源库,允许Java程序直接调用C/C++库的函数,而不需要JNI(Java Native Interface)的复杂过程。 - 基本原理:JNA通过映射原生函数到Java方法来实现调用。它提供了Structure和Pointer等类来...
本篇中文翻译版旨在帮助读者快速了解JNA的基本概念及其使用方式。 #### 二、JNA项目概述 - **项目来源**:JavaNativeAccess项目位于Java.net,提供了一系列用于调用本地方法的工具和示例。 - **核心组件**:该项目...
#### JNA简介 JNA 是一个Java库,它允许Java程序直接调用本地库而无需编写JNI接口代码。JNA通过反射机制和JNI实现这一功能,使得开发者可以更容易地与本地库进行交互,尤其是在处理C语言编写的动态链接库(DLL)时。 ...
1. JNA简介: Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用本地库(即C和C++编写的动态链接库或静态库)。JNA通过Java接口描述语言(Interface Definition Language, IDL)来定义...
- **JNA项目简介**:Java Native Access (JNA) 是一个轻量级的Java库,旨在简化开发人员在Java应用程序中调用本地操作系统API的需求。传统上,这种需求通过Java Native Interface (JNI) 来满足,但JNI的使用往往伴随...
JNA 简介** JNA(Java Native Access)是 Java 平台上一个开源库,允许 Java 代码直接调用操作系统原生函数,无需编写 JNI(Java Native Interface)代码。JNA 提供了一种动态方式来映射 Java 类到 C 风格的结构体...
`jnaerator-0.12-shaded`是一个与Java Native Access (JNA) 配合使用的工具,它简化了Java应用程序与C/C++等本地库的交互过程。JNAerator的主要功能是自动生成JNA接口代码,使得Java开发者无需手动编写复杂的JNI...
JNA简介 - **定义**:JNA是一个由SUN公司主导开发的开源框架,基于经典的JNI技术。它提供了与.NET平台上的P/Invoke相似的功能,能够极大地简化调用本地动态链接库(DLL或SO)的过程。 - **优势**:相较于传统的JNI...
**JNA简介** JNA是一个Java库,允许Java代码直接调用本机API,无需编写JNI代码或使用其他工具。JNA通过提供一个接口定义,然后在运行时动态地映射到相应的本机函数。 **步骤1:添加JNA依赖** 要使用JNA,你需要在你...
#### 二、JNA简介 JNA(Java Native Access)是一种用于从Java代码访问本地库的框架。与JNI相比,它不需要编译任何C/C++代码,简化了开发过程。通过JNA,开发者可以轻松地调用操作系统API,比如Windows API中的函数...
**ICTCLAS API 及使用方法** ICTCLAS(信息技术-中文自动分词系统)是北京大学计算语言研究所开发的一款高效、准确的中文分词工具,它在自然语言处理领域广泛应用,尤其是在文本预处理中,如信息检索、情感分析、...
- **配置插件**:在MyEclipse的“Window” -> “Preferences” -> “Team”中,选择SVN并配置SVN连接器,通常选择JNA库。 - **关联项目**:在MyEclipse中,右键点击项目,选择“Team” -> “Share Project”,在弹...