Java JNA调用dll

JNA(Java Native Access)是一个开源的Java框架,是Sun公司推出的一种调用本地方法的技术,是建立在经典的JNI基础之上的一个框架。之所以说它是JNI的替 代者,是因为JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成。

注意:

  • JNA GitHub:https://github.com/java-native-access/jna
  • JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。
  • 原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。
  • JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射,你不再需要编写C动态链接库。
  • 也许这也意味着,使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。但总体影响不大,因为JNA也避免了JNI的一些平台配置的开销。

JNA简单使用:

首先将JNA与JNA Platform加入pom。

<dependency>
  <groupId>net.java.dev.jna</groupId>
  <artifactId>jna</artifactId>
  <version>5.2.0</version>
</dependency>
<dependency>
  <groupId>net.java.dev.jna</groupId>
  <artifactId>jna-platform</artifactId>
  <version>5.2.0</version>
</dependency>

然后编写测试类:

package me.kagura;

import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * Simple example of JNA interface mapping and usage.
 */
public class TestJNA {
    // This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World");
    }

    public interface CLibrary extends Library {
        CLibrary INSTANCE = Native.loadLibrary(("msvcrt"), CLibrary.class);

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

要点:

  • 需要定义一个接口,继承自Library StdCallLibrary;默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary,比如众所周知的kernel32库。
  • 接口内部需要一个公共静态常量:INSTANCE,通过这个常量,就可以获得这个接口的实例,从而使用接口的方法,也就是调用外部dll/so的函数。
  • 搜索动态链 接库路径的顺序是:先从当前类的当前文件夹找,如果没有找到,再在工程当前文件夹下面找win32/win64文件夹,找到后搜索对应的dll文件,如果 找不到再到WINDOWS下面去搜索,再找不到就会抛异常了。比如上例中printf函数在Windows平台下所在的dll库名称是msvcrt,而在 其它平台如Linux下的so库名称是c。

类型映射:

有过跨语言、跨平台开发的程序员都知道,跨平台、语言调用的难点,就是不同语言之间数据类型不一致造成的问题。绝大部分跨平台调用的失败,都是这个问题造成的。关于这一点,不论何种语言,何种技术方案,都无法解决这个问题。JNA也不例外。

上面说到接口中使用的函数必须与链接库中的函数原型保持一致,这是JNA甚至所有跨平台调用的难点,因为C/C++的类型与Java的类型是不一样的,你必须转换类型让它们保持一致,这就是类型映射(Type Mappings),JNA官方给出的默认类型映射表如下:数据来源:https://github.com/java-native-access/jna/blob/master/www/Mappings.md

未经允许不得转载:鹞之神乐 » Java JNA调用dll

赞 (0) 打赏

评论

5+2=

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏