JNA-JNI升级版

本文介绍了JNA(Java Native Access)框架,它是SUN公司开发的基于JNI的更简单、更易用的框架,允许Java程序直接调用.dll/.so库而无需额外的适配器代码。通过示例展示了如何使用JNA调用C运行时库的printf函数和自定义的C DLL函数,使得Java程序员可以避免JNI的繁琐步骤,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

       JNA(Java Native Acess)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架,  功能强大,易用,类似于.NET的P/Invoke. 我们知道, 使用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的一大弱点!

 

二、P/InvokeJNA

       而在.NET平台上,强大的P/Invoke技术使我们Java程序员非常羡慕. 使用P/Inovke技术, 只需要使用编写一个.NET函数,再加上一个声明的标注, 就可以直接调用dll中的函数. 不需要你再使用C语言编写dll来适配.

       现在, 不需要再羡慕.NET的P/Invoke机制了, JNA把对dll/so共享库的调用减少到了和P/Invoke相同的程度. 使用JNA, 不需要再编写适配用的.dll/.so, 只需要在Java中编写一个接口和一些代码, 作为.dll/.so的代理, 就可以在Java程序中调用dll/so.

三、快速启动:

       下载一个jar包,就可以使用JNA的强大功能方便地调用动态链接库中的C函数. 示例1:

import com.sun.jna.Library;

import com.sun.jna.Native;

import com.sun.jna.Platform;

 

public class HelloWorld {

 

       public interface CLibrary extends Library {

              String libraryName = Platform.isWindows() ? "msvcrt" : "c";

              CLibrary INSTANCE = (CLibrary)Native.loadLibrary(libraryName, CLibrary.class);

              void printf(String format, Object... args);

       }

      

       public static void main(String[] args) {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值