上一篇《JAVA本地接口(JNI)》中介绍了JAVA的JNI技术,通过JAVA自有的方式调用动态链接库,这一篇将继续为大家介绍使用其他方式调用动态链接库。
首先,我们编写一个用于测试的链接库

头文件 print.h

#ifdef DLL_IMPLEMENT  #define DLL_API __declspec(dllexport)
#else  #define DLL_API __declspec(dllimport)
#endif #ifndef _Included_PRINT#define _Included_PRINT#ifdef __cplusplusextern "C" {#endifDLL_API void print();DLL_API void print2(int i);DLL_API int print3(int i);#ifdef __cplusplus}#endif
#endif

源文件 print.c

#define DLL_IMPLEMENT
#include <stdio.h>
#include "print.h"
DLL_API void print()
{printf("invoke print...");
}
DLL_API void print2(int i)
{printf("invoke print %d...", i);
}
DLL_API int print3(int i)
{return i;
}

使用c编译器对其进行编译:cl -LD print.c -Feprint.dll
然后我们将生成的print.dll放在系统的system32文件夹下,至此准备工作完成。

JNative

JNative是Java to native interface的缩写,使用JNative,我们可以很方便的调用动态链接库,使用示例如下:

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;public class JNativeTest
{public static void main(String[] args) throws Exception{// 加载动态链接库JNative print = new JNative("print.dll", "print");// 执行函数print.invoke();JNative print2 = new JNative("print.dll", "print2");// 设置函数形参print2.setParameter(0, 2);print2.invoke();JNative print3 = new JNative("print.dll", "print3");// 设置返回值类型print3.setRetVal(Type.INT);print3.setParameter(0, 3);print3.invoke();// 获得运行结果String result = print3.getRetVal();System.out.println("print3:" + result);}
}

下面再给出一个使用JNative获得系统时间的示例:

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.util.Kernel32.SystemTime;public class JNativeDemo extends AbstractBasicData<JNativeDemo>
{public short wYear;public short wMonth;public short wDayOfWeek;public short wDay;public short wHour;public short wMinute;public short wSecond;public short wMilliseconds;/*** 分配内存,并返回指针*/public Pointer createPointer() throws NativeException{pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));return pointer;}/*** 内存大小*/public int getSizeOf(){return 8 * 2;}/*** 获取通过内存指针解析出结果*/public JNativeDemo getValueFromPointer() throws NativeException{wYear = getNextShort();wMonth = getNextShort();wDayOfWeek = getNextShort();wDay = getNextShort();wHour = getNextShort();wMinute = getNextShort();wSecond = getNextShort();wMilliseconds = getNextShort();return this;}public JNativeDemo() throws NativeException{super(null);createPointer();}public String toString(){return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":"+ wMinute + ":" + wSecond + ":" + wMilliseconds;}public static SystemTime GetSystemTime() throws NativeException,IllegalAccessException{// 创建对象JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");SystemTime systemTime = new SystemTime();// 设置参数nGetSystemTime.setParameter(0, systemTime.getPointer());nGetSystemTime.invoke();// 解析结构指针内容return systemTime.getValueFromPointer();}public static void main(String[] args) throws NativeException,IllegalAccessException{System.err.println(GetSystemTime());}
}

JNA

JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

使用示例:

import com.sun.jna.Library;
import com.sun.jna.Native;public class JNADemo
{// 定义接口CLibrary,继承自com.sun.jna.Librarypublic interface CLibrary extends Library{// 定义并初始化接口的静态变量CLibrary Instance = (CLibrary) Native.loadLibrary("print", CLibrary.class);// 函数声明void print();void print2(int i);int print3(int i);}public static void main(String[] args){CLibrary.Instance.print();CLibrary.Instance.print2(2);System.out.println("print3:" + CLibrary.Instance.print3(3));}
}

JNative和JNA都可以实现对DLL的调用,但二者各有优缺点,需要根据实际情况选择。

JAVA调用动态链接库相关推荐

  1. java 调用动态链接库_JAVA技巧:JNative调用动态链接库问题(SOS)

    动态链接库的方法如下:__declspec(dllexport) ret __stdcall rLachTran(const char *pc_trancode, const char *pc_cli ...

  2. Java调用动态链接库读取RFID

    1.java要读取动态连接库,首先要有库文件,即dll文件,jdk中自带的有一部分dll文件,但是大部分情况下我们都是调用自己的库文件,这个时候就要把dll文件加载到java.library.path ...

  3. JNative 调用动态链接库 调用动态链接库函数

    假设我有一个叫test.dll的动态库,其中有一个函数如下:     extern "C" int add(int* a,int* b,int* c,int d,char* Pic ...

  4. Java调用C/C++编写的第三方dll动态链接库(zz)

    这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...

  5. java jni调用dll文件_Java通过jni调用动态链接库

    (1)JNI简介 JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始,JNI标准成为java ...

  6. native关键字(本地方法)、 java调用so动态链接库

    Java native关键字 一. 什么是Native Method    简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个j ...

  7. java调用c语言的动态库,hu-unix下面java调用c语言动态链接库.docx

    PAGE / NUMPAGES glddydyzcw HU-unix下面java调用C语言动态链接库我在Hp-unix下面用java JNI怎么调用C语言的动态链接库??System.loadLibr ...

  8. (JNI/JNA)java 调用c/c++ 动态链接库 全套操作+踩坑集锦

    第一篇文章终于写完-跨行三年,一直都是看别人的文章-今天咱终于自己写了一篇,自己总结的,希望能给你一点点帮助,如有错误,希望指出,立马改正. 0 前言 Java代码是跨平台的,其与硬件环境彻底&quo ...

  9. 使用JNA,让java调用原生代码

    JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...

最新文章

  1. JAVA多线程之中断机制(如何处理中断?)
  2. query 防止ajax重复提交
  3. strtus2改成springboot_jdk1.6环境下struts2改spring boot方案-阿里云开发者社区
  4. python职能-python随机模块22个函数详解(下)
  5. DHTML4(select与checkbox应用)
  6. 安卓线程相关 HandlerThread Handler Thread Looper Message Runnable
  7. Win11系统如何隐藏快速搜索
  8. 购买域名和GitHub映射
  9. linux 多块磁盘挂一个文件夹,Linux单目录挂载多块磁盘
  10. bartlett方差齐性检验_数据总体分布检验
  11. JavaWeb 自制基础开发框架准备环境搭建
  12. Latex添加矢量图/将visio画图转换成矢量图
  13. access中布局为阶梯怎么设计_基于Solidworks的阶梯轴类零件参数化设计研究
  14. 微信转发软件后缀_微信发送不了100M的视频?其实只需要改个后缀,长知识了...
  15. 快2023年了,一个初级前端开发要达到什么水平?
  16. jupyter查看python包
  17. ios 项目开发中总结
  18. Cris 学 SpringMVC(二):使用 servlet 原生 api 作为方法入参
  19. 〈原创〉诗如文学之筋骨,琴乃乐中之天籁
  20. 【2017年计算机408统考真题】计组13题 主存储器

热门文章

  1. 友盟统计java代码_SFAnalytics 分析友盟统计源码,反编译 SDK,还有部分没有 出来 android 259万源代码下载- www.pudn.com...
  2. collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键
  3. 计算机一级资料书推荐,推荐版 全国计算机一级考试试题【史上最全面的资料,不看你就亏!】.doc...
  4. 椭圆形中间一个大写的v_静安区椭圆形桥梁空心板橡胶气囊,方形桥梁板橡胶气囊_冠桥橡胶...
  5. oracle 插入一个语句,oracle如何通过1条语句插入多个值 oracle通过1条语句插入多个值方法...
  6. java继承总结_JAVA笔记:Java中的继承总结
  7. java string 包含http_Java中使用HttpPost上传文件以及HttpGet进行API请求(包含HttpPost上传文件)...
  8. 用友邮件撤回怎么操作_用户体验原则——“操作可控”
  9. 正确使用计算机说课稿,《初识计算机》说课稿
  10. golang mysql封装_golang如何封装路由