Java通过JNA或JNI调用C++动态库

 一.Java通过JNA调用C++动态库  

  1. java代码里添加jna依赖,修改pom.xml文件

<dependency>

        <groupId>net.java.dev.jna</groupId>

        <artifactId>jna</artifactId>

        <version>5.7.0</version>

</dependency>

  2.创建一个接口,该接口继承Library

  3. 创建一个实现类(先不运行)

  4. 打开VS创建C++应用程序,新建一个cpp文件,修改其头文件

  5. cpp文件引入头文件并实现方法

  6. 生成dll文件

       右键项目,点击属性,保证输出配置为dll。最后右键解决方案,点击生成解决方案

  7. 运行java程序进行测试 

二.Java通过JNI调用C++动态库 

  1. java创建一个测试类 

  2. cmd进入对应的文件夹路径并进行编译,编译时要把中文注释删了

      输入 javac JNITest.java 生成一个.class字节码文件

      再输入 javac -h ./ JNITest.java 生成一个.h头文件

  3. 打开VS创建C++应用程序,新建一个cpp文件,将上一步生成的.h头文件复制到项目目录下,并手动添加 

  4.以同样的方式添加jni.h和jni_md.h(在jdk中查找和复制)

  5. 如果引用jni.h时还有报错,则修改符号

  6. 编写cpp文件,引入头文件实现对应方法

  7. 生成dll文件

      右键项目,点击属性,保证输出配置为dll。最后右键解决方案,点击生成解决方案

  8. 将生成的动态库放到项目根目录里(或者是jdk的bin目录下),运行测试

三. JNI和JNA区别

    JNI允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。步骤非常的多,很麻烦。

        

    JNA框架解决了既需要编写java代码,又要编写C语言的代理方法及很多数据类型的转换的问题,它提供一组Java工具类用于在运行期动态访问系统本地共享类库而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,大大降低了Java调用本体共享库的开发难度。

    JNA调用C/C++的过程大致如下:

        

    JNA 调用比 JNI 调用更方便!

    JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。

    原来使用JNI,你必须手工用C/C++写一个动态链接库,在C/C++语言中映射Java的数据类型。

    JNA中,它提供了一个动态的C/C++语言编写的转发器,可以自动实现Java和C/C++的数据类型映射,你不再需要编写C/C++动态链接库。

    也许这也意味着,使用JNA技术比使用JNI技术调用动态链接库会有些微的性能损失。但总体影响不大,因为JNA也避免了JNI的一些平台配置的开销!

    JNA 调用比 JNI 调用性能有损失!

    总之,JNA 在编程方面比 JNI 更方便,但是性能上 JNI 比**JNA ** 有优势,看情况进行取舍。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值