`
xiaoming530
  • 浏览: 33681 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JNA使用手记

    博客分类:
  • JAVA
 
阅读更多

JNA使用手记一:

    JNA初体验

相信关注这篇文章的朋友都有使用过jni的痛苦经历:
1,我是一个java开发人员,对C一点都不熟悉,jni让我用c写程序,开玩笑吧?

2,写c程序就罢了,hello world我还是写过,可你居然要我写个动态链接库!

3,难道我还得去配个c的编译环境,饶了我吧!

4,什么,原来我为调一个dll,又为这个dll包了一个dll,这不是坑爹吗?

所以有人说,JNI是java程序员的禁区,这是有原因的。

 

那么,传说中的JNA会为我们带来什么好处呢?据我的初步体验,现实的好处有2个

第一,不用为了调用一个动态库,自己还得再写意个动态库了,谁也不愿意当傻瓜,干体力活

第二,在java的类与c的结构体之间建立了映射关系,可以不再为异构的数据类型太过操心(其实还是有不少心要操)。

让我们来看看一个不是最简单,却行之有效的例子吧,我讨厌那种简单的毫无实用价值的例子。

import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;

/**
 * 测试JNA是否可以使用结构体调用dll
 * User: xiaoming
 * Email: xiaoming8484@gmail.com
 * Date: 11-8-21
 * Time: 下午2:13
 */
public class Kernel32Test {

    /**
     * 声明dll的接口
     */
    public interface Kernel32 extends StdCallLibrary {
        Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
        void GetSystemTime(SYSTEMTIME result);
    }

    /**
     * 定义与dll结构体对应的对象
     */
    public static class SYSTEMTIME extends Structure {
        public short wYear;
        public short wMonth;
        public short wDayOfWeek;
        public short wDay;
        public short wHour;
        public short wMinute;
        public short wSecond;
        public short wMilliseconds;

    } 

    /**
     * 结构体的定义名称不一定要与c的保持一致,只需要数据结构一致即可
     */
    public static class Input extends Structure {
        public SYSTEMTIME systemtime;
    }

    public static void main(String args[]) {
        Kernel32 lib = Kernel32.INSTANCE;
        SYSTEMTIME time = new SYSTEMTIME();
        Input input = new Input();
        lib.GetSystemTime(time);
        //lib.GetSystemTime(input);

        System.out.println("Today's integer value is " + time.wDay);
//        System.out.println("Today's integer value is " + input.systemtime.wDay);
    }
}
 

没错,这就是全部,你是不是打算立即抛弃JNI了,其实你并没有逃离JNI的掌心,只是JNA帮你干了脏活而已,我们上班这么累,太需要有人帮我们干脏活了。

我们是艺术家,我们需要做有创造性的事情。

 下一次见面将会给大家介绍JNA与C数据类型的对应关系,看我们面临哪些脏活,怎么样远离他们?

分享到:
评论

相关推荐

    Java JNA使用参考手册.pdf

    以下是一个简单的JNA使用示例: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; /** * Simple example of JNA interface mapping and usage. */ public class ...

    JNA使用详解,包括jna.jar 和一个完整的JNA例子

    该资源中,包含jna.jar 和一个jna的函数文档。并且有一个完整的使用例子。该例子是访问本地的IC卡读卡器,其中因为原始厂商提供的本地代码函数过于发杂,为了便于JNA调用,又对本地代码...这是一个很好的JNA使用范例。

    JNA 使用方法

    JNA 使用方法 JNA(Java Native Access)是一种可以让 Java 程序直接调用本地方法的框架,不需要额外的处理或配置,也不需要多余的引用或编码。JNA 框架是 SUN 公司主导开发的,建立在经典的 JNI(Java Native ...

    jna.rar_jna_jna.jar_jna文件

    使用JNA,你可以执行以下操作: 1. 调用操作系统API:比如获取系统信息、文件操作、网络通信等。 2. 与本地库交互:例如,使用OpenCV、OpenGL或其他C/C++库。 3. 操作硬件设备:如读写硬件寄存器或控制GPIO引脚。 4....

    JAVA-JNA简单使用

    JNA使用一个配置文件(通常名为`native.lib`),该文件定义了本地库的函数和数据类型。 2. **安装JNA**:要使用JNA,首先需要将其添加为项目的依赖。如果你使用的是Maven,可以在`pom.xml`文件中添加JNA的依赖项。...

    jna整合包-jna4.5.0+jna4.0.0.rar

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的原生函数,而无需编写任何C/C++代码或使用JNI(Java Native Interface)。JNA通过提供一种映射机制,将Java方法与本地库...

    jna调用dll完成demo实例, 超简单

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用操作系统提供的本地库函数,而无需编写任何C/C++代码或使用JNI(Java Native Interface)。本实例将详细介绍如何使用JNA调用DLL动态链接...

    jna-platform-4.0.0.jar、4.1.0.jar、4.2.0.jar、4.2.1.jar、4.2.2.jar及JNA使用方法、程序示例

    内部包含6个文件,其中五个是最新JNA jar包,包括jna-platform-4.1.0.jar、jna-platform-4.2.0.jar、jna-platform-4.2.1.jar、jna-platform-4.2.2.jar,一个是JNA介绍文档,包括在线帮助、入门示例、简单程序示例等...

    使用JNA获取窗口句柄,并发送消息

    JNA提供了一种无需编写C代码或使用JNI(Java Native Interface)即可调用操作系统API的方法。本话题将详细介绍如何使用JNA获取窗口句柄并发送消息,以及在CS(Client-Server)架构中实现SSO(Single Sign-On)。 ...

    jna-3.3.0 & jna-3.3.0-platform

    JNA通过映射Java方法到本地函数,实现了Java与操作系统底层功能的交互,极大地简化了在Java应用中使用系统API或DLL库的过程。在这个场景中,我们有两个文件:`jna-3.3.0.jar`和`jna-3.3.0-platform.jar`,它们分别是...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    jna&jna-platform4.0版和5.6版本.zip

    对于Java开发者来说,正确选择和使用JNA及jna-platform的版本至关重要。选择版本时,需要考虑以下几个因素: - **项目需求**:根据项目需要调用的本机库和API,确认所需的最低支持版本。 - **兼容性**:确保所选版本...

    JNA-5.7.0 jna-platform-5.7.0

    Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码与本地操作系统功能进行交互,无需编写...通过学习和掌握JNA的使用,开发者可以轻松地将Java应用与各种本地系统服务集成,提升应用的功能性和效率。

    Android通过JNA调用C,C++方法

    本篇文章将详细讲解如何在Android中使用JNA来调用C/C++方法。 首先,了解JNA的基本概念。JNA是一种轻量级的Java库,它允许Java程序直接调用动态链接库(DLL)或共享库(SO)中的函数,无需编写JNI代码。相比之下,...

    com.sun.jna 3.0.9

    "jna" 指的是Java Native Access,而 "jna-example" 暗示了这个话题将涉及JNA的使用示例,这对于初学者或者需要深入理解JNA功能的人来说非常有价值。 **文件列表解析:** 压缩包中唯一的文件 `jna-3.0.9.jar` 应该...

    jna-4.5.1 , jna-4.5.1-sources , jna-platform-4.5.1 jar包

    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工具类用于在运行期动态...

    JNA实例 JNA实例 JNA实例

    Java源代码部分主要展示了如何使用JNA调用上面定义的C语言函数。关键点如下: 1. **引入依赖库**: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.NativeLong; import ...

    JNA调用DLL完整实例demo

    本篇文章将深入探讨如何使用JNA来调用DLL,并提供一个完整的实例。 首先,了解JNA的基本原理至关重要。JNA通过映射Java接口到原生函数来实现与本地代码的交互。这些接口定义了要调用的函数签名,JNA会自动处理参数...

    jna运行在android上的例子

    1. **JNA库的集成**:项目可能包含如何将JNA库添加到Android项目的构建文件(如build.gradle)中,以便在应用中使用JNA。 2. **示例代码**:可能有Java类展示了如何使用JNA接口来调用Android或Linux系统的函数,...

    JNA 4.1.0 官方版

    通过研究源码,开发者可以更好地理解JNA如何处理内存管理、类型转换和错误处理,从而在使用时更加得心应手。 JNA的工作原理是通过动态加载动态链接库(DLL on Windows,.so on Linux,dylib on Mac OS X),并将...

Global site tag (gtag.js) - Google Analytics