介绍
给大家介绍一个最新的访问本机代码的
Java
框架
—JNA
。
JNA(Java Native Access)
框架是一个开源的
Java
框架,是
SUN
公司主导开发的,建立在经典的
JNI
的基础之上的一个框架。
JNA
项目地址:
https://jna.dev.java.net/
非常强大、易用,功能上类似与
.NET
的
P/Invoke
。
不堪回首的
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
的一大弱点!
.NET
平台上强大的
P/Invoke
而在
.NET
平台上,强大的
P/Invoke
技术使我们
Java
程序员非常羡慕。使用
P/Invoke
技术,只需要使用编写一个
.NET
函数,再加上一个声明的标注,就可以直接调用
dll
中的函数。
不需要你再使用
C
语言编写
dll
来适配。
不逊于
P/Invoke
的
JNA
现在,不需要再羡慕
.NET
的
P/Invoke
机制了。
JNA
把对
dll/.so
共享库的调用减少到了和
P/Invoke
相同的程度。
使用
JNA
,不需要再编写适配用的
.dll/.so
,只需要在
Java
中编写一个接口和一些代码,作为
.dll/.so
的代理,就可以在
Java
程序中调用
dll/so
。
JNA
快速启动
现在让我们直接进入
JNA
的世界。
你只需要下载一个
jar
包,就可以使用
JNA
的强大功能方便地调用动态链接库中的
C
函数。
1
,下载
jna.jar
。
在这里
https://jna.dev.java.net/servlets/ProjectDocumentList?folderID=7408&expandFolder=7408&folderID=0
2
,现在你已经可以使用
JNA
了。
为了方便你参考
JNA
的
java
类库,我制作了《
JNA3.09API
参考手册》,是
CHM
格式的。你可以到这里下载
http://download.csdn.net/source/900438
JNA
例子
例子
1
现在让我们运行一个
JNA
程序,感受它的强大威力。
1
,在
Java
项目中引入
jna.jar
包。
2
,创建一个类:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of native library declaration and usage. */
public class HelloWorld {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i=0;i < args.length;i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
3
,执行,可以看到控制台中打印出了
Hello, World
但是,请注意,这个程序实际上是使用
msvcrt.dll
这个
C
运行时库中的
printf
函数打印出上面这些字符的。
看,多简单,不需要写一行
C
代码,就可以直接在
Java
中调用外部动态链接库中的函数!
例子
2
上面那个例子使用了操作系统自带的动态链接库,现在我们再自己写一个动态链接库试试。
1
,在
VS
中选择
C++
语言,然后选择创建一个
Win32
程序。
选择
dll
类型。
2
,发布的
C
函数是:
#define
MYLIBAPI
extern
"C"
__declspec
(
dllexport
)
MYLIBAPI
void
say(
wchar_t
* pValue);
这个函数的实现是:
void
say(
wchar_t
* pValue){
std::wcout.imbue(std::locale(
"chs"
));
std::wcout<<L
"上帝说:"
<<pValue<<std::endl;
}
它需要传入一个
Unicode
编码的字符数组。然后在控制台上打印出一段中文字符。
3
,生成
dll
。然后把生成的
dll
文件复制到
Eclipse
项目中,放在项目下面。
4
,在
Eclipse
中编写以下代码:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.WString;
/**
* @author
沈东良
Edward Shen shendl_s@hotmail.com
* 2008-11-23
下午
05:07:14
*TestDll1.dll
*/
public class TestDll1Service {
public interface TestDll1 extends Library {
/**
*
当前路径是在项目下,而不是
bin
输出目录下。
*/
TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class);
public void say(WString value);
}
/**
*
*/
public TestDll1Service() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestDll1.INSTANCE.say(new WString("Hello World!"));
System.out.println("HHEEH
我我们无法万恶
");
}
}
5
,执行这个
Java
类。可以看到控制台下如下输出:
上帝说:
Hello World!
HHEEH
我我们无法万恶
6
,上面一行是
C
语言使用
C++
的
std::wcout
输出的。
下面一行是
Java
语言输出的。
分享到:
相关推荐
**标题:“JNA—JNI终结者”** 这篇文章探讨的主题是Java Native Access (JNA) 和 Java Native Interface (JNI),两者都是Java平台上的技术,用于在Java应用程序中调用本地(非Java)代码。它们允许Java程序员与...
JNA通过一个小型的JNI库来实现对本地代码的动态调用。其主要特点包括: - 开发者仅需通过Java接口描述目标本地库的功能和结构,从而轻松利用本机平台的功能,而无需为多平台配置和生成JNI代码付出高昂的成本。 - JNA...
本项目"jni-jna-web.zip"是一个基于Spring Boot 2.3.0的Web工程,深入实践了JNI和JNA的应用。 首先,让我们来了解一下JNI。JNI是一种原生接口,允许Java代码直接调用本地(非Java)代码。它通过定义了一套API,使得...
在这种情况下,"springboot+jna/jni调用动态so/dll库"是一个重要的主题,它涉及到Spring Boot应用如何利用Java Native Interface (JNI) 和 Java Native Access (JNA) 这两种技术来调用操作系统级别的动态链接库(.so...
这里我们主要探讨两种方式:JNI(Java Native Interface)和JNA(Java Native Access)。这两种技术允许Java代码与本地代码进行交互,使得Java开发者能够利用非Java编写的库或操作系统功能。 首先,JNI是Java平台...
JNI(Java Native Interface)和JNA(Java Native Access)都是Java平台上的原生接口技术,允许Java代码与操作系统底层交互,调用本地库。它们在功能上类似,但实现方式不同,因此性能也有所差异。 ### JNI JNI是...
该存储库包含两个子项目,一个用于 JNI,一个用于 JNA。 实现的用例是 在 C 中生成一个随机数并从 Java 打印结果 填充目录中的文件列表,将其传递给 Java 并打印列表 要编译和运行示例,需要执行以下步骤: 设置 ...
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native ...是JNI终结者。
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与...
JNA—JNI终结者,java调用dll、ocx、so最简单的方法中提到的包 jna.jar
分别用JNI和JNA的方式建立dll,dll中包含一个get方法和一个set方法,在java端进行循环调用1000*1000次,比较所耗费的时间。 结论:JNI消耗的总时间(16ms) JNA消耗的总时间(2593ms) 性能:JNI >> JNA
JNA是一种更高级、更易使用的替代方案,它通过映射Java方法到本地函数来避免JNI的复杂性。关键知识点包括: 1. **Interface定义**:在JNA中,我们定义一个接口,其中的方法对应于本地库的函数,JNA会自动处理参数和...
JNA3.09API参考手册.chm 是我制作的JNA类库3.09版的Java API参考手册。方便查找。 JNA是最新的Java平台上调用动态链接库.dll/.so的类库。是JNI终结者。
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地函数,而无需编写JNI(Java Native Interface)代码。JNI是Java与本机代码交互的标准方式,但它通常需要编写大量的C/...
JNA提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java...
JNA是一种Java库,允许Java代码直接调用本机API,而无需编写JNI代码。相比于JNI,JNA的使用更为简单和直观,但可能在性能上稍逊一筹。当我们需要处理复杂的C结构体,例如包含嵌套结构、数组或指针的结构体时,JNA...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写任何C/C++代码或使用JNI(Java Native Interface)。JNA通过提供一种映射机制,将Java方法与本地库...
研究java调用dll的时候,大部分都是通过jni,比较麻烦,我找到了通过jna方法调用dll的方法,用起来比较方便,只需要引用jna.jar包,这个jar包已经包含在程序中,还包含了我调用dll的遇到难道的解决办法。
JNA(Java Native Access)是另一种与本地代码交互的方式,相比JNI,它更为简单和灵活。JNA提供了无需编写大量C/C++代码就能调用本地库的方法。JNA的核心是通过映射Java接口到本地函数,使得Java代码可以直接调用...
JNI提供了一种方式,让本地(非Java)代码可以访问和调用Java类、方法和字段。这通常涉及编写C/C++代码,然后通过Java代码暴露一个native方法来调用这些本地代码。在Android Studio或Eclipse中,我们可以使用NDK...