Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。

Java调用C/C写好的DLL库时,由于基本数据类型不同、使用字节序列可能有差异,所以在参数传递过程中容易出现问题。

使用Java调用DLL动态链接库的方案通常有三种:JNI, Jawin, Jacob. 其中JNI(Java Native Interface)是Java语言本身提供的调用本地已编译的函数库的方法,本身具有跨平台性,可以在不同的机器上调用不同的本地库。Jawin和 Jacob都是sourceforge.net的开源项目,都是基于JNI技术的依赖Windows的实现,使得在Windows平台下使用COM和 DLL的更加方便。

JNI

JNI的应用方案是基于Java类和本地函数相映射的。其使用Java调用DLL的步骤还是相对比较麻烦,不但涉及到Java编程,还涉及到C/C编程。

JNI的使用步骤是:

1.编写Java类,用该类将DLL对外提供的函数服务进行声明,其中的Java方法均声明为native,其方法签名可以自定义,不用实现函数体。

2.用Javah工具将该Java类生成对应的.h头文件。

3.最重要的比较麻烦的一步:编写C/C代码实现.h头文件中声明的函数,该C/C代码中包含jni.h头文件,并且编写代码时使用其中定义好的数据类型作为函数的输入和返回数据类型进行编程。用这种方法实现数据类型转换。例如数据类型:boolean(java) à jboolean(jni.h: typedef unsigned char jboolean),在自己编写的C/C代码中使用数据类型jboolean映射Java中的boolean类型。在该步骤中,可以在C/C代码中调用已经存在的DLL库。

4.另外编写的Java代码时就可以使用该Java类了。

在第3步中,编写C/C函数时,可以使用一个叫interface pointer的env指针来调用JNI提供的一系列(很多)函数,用这些函数来访问JVM的对象和数据。

使用JNI的缺点:使用比较麻烦,需要对已有的DLL进行封装,需要对C/C比较了解。

使用JNI的优点:可以跨平台调用本地库。

Jawin

Jawin的应用方案是基于函数调用时采用原始字节流传递数据的。就是在Java中指明一个DLL中的某个函数后,通过原始字节流(需要考虑参数数据类型所占的存储字节数及系统使用的字节序列)传递给该DLL函数需要的参数,其返回值也是通过原始字节流解析的方式获得正确的值。

Jawin的使用步骤:

1.环境配置:下载Jawin;Jawin.dll放入工程目录下;Jawin.jar相关jar文件加入到运行库中(LibPath或者Eclipse下配置工程的BuildPath-AddLibrary)。

2.获得函数指针:new FuncPtr("DllFileName.DLL", "dllFunctionName");

3.用LittleEndianOutputStream将函数需要的参数写入到一个原始字节流NakedByteStream。

4.最重要的一步:调用FuncPtr.invoke()。传入参数比较复杂。

5.解析上一步的返回值(字节数组)。

第4步中传入的参数包括:

1.指令字符串。一个"XXX:Y:ZZZ"格式的字符串。其含义分别是传入参数中的每个字节的数据类型意义、返回值的类型、需要从传入指针中读取的数据(inout类型参数)。比如:

函数签名int func(int, int, struct s*, char*); //其中struct s*调用完函数后需要读出,struct s所占字节数为16。

其指令字符串为:IIP16G:I4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型I对应的4个字节,然后是inout类型的参数中n16对应的16个字节。

其中字符串的意义可以在Jawin提供的文件instructions.h中找到,或者在官方文档(Jawin数据指令)中找到常用的一些指令字符串的意义。

2.传入参数的总字节大小。

3.前面写好的传入参数的原始字节流。

4.一个object数组。

5.ReturnFlags,用以根据C/C返回值将C/C的错误转换为Java的异常并抛出。其中CHECK_NONE表示不检查;CHECK_FALSE和CHECK_WIN32分别表示返回0是FALSE和 SUCCESS,根据是否出错决定是否抛出异常;CHECK_HRESULT表示使用COM模型中的HRESULT作为返回值,其错误码可以配置。

使用Jawin的缺点:不方便调试,几乎所有的错误都抛出同样的异常COMException;需要对数据类型的转换比较了解;不能跨平台,对Windows的依赖性比较强。

使用Jawin的优点:方便使用,不用进行C/C开发,不用对原始DLL进行封装就可以方便使用。

Jacob

Jacob是Java-Com Bridge的缩写,也可以用来调用DLL。其底层也是使用JNI实现,也具有Windows 的平台依赖性,但是网上有人反映其易用性不如jawin。

怎么反编译java dll_JAVA 反编译工具,如何在Java中调用DLL方法相关推荐

  1. java中调用 dll 动态库的简洁方法 JNative

    Java中调用DLL方法,是通过JNI接口实现的,http://www.ibm.com/developerworks/cn/java/l-linux-jni/ 这里有详细的说明.大概是先用Java写一 ...

  2. java的调试页面_[Java教程]使用开发者工具调试jsp页面中的脚本

    [Java教程]使用开发者工具调试jsp页面中的脚本 0 2016-04-21 23:00:07 只举例火狐和谷歌.如果是火狐,一般是用firebug,首先确保开启脚本调试: 然后刷新一下要调试的页面 ...

  3. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

  4. 如何在java中调用js方法

    [java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...

  5. Java实现 for循环输出空心的菱形 在main方法中调用printHollowRhombus()方法完成10行的空心菱形输出,其中 printHollo

    Java实现for循环输出空心的菱形 @author asus 在main方法中调用printHollowRhombus()方法完成10行的空心菱形输出,其中 printHollowRhombus() ...

  6. HTML调用Java函数或语句,在动态THML语句中调用JS函数传递带空格参数的问题

    刚刚遇到一个问题,调用js函数的参数里带空格,造成调用失败的问题. 部分代码如下: html+=" "; //name中如果有空格就是调用失败 html+=" " ...

  7. java免费代码混淆工具 支持JDK16 java加密

    java代码可以反编译,因此有时候要保护自己的知识产权还真得费点心思,一般来说有三个思路: 1.将class文件加密,这个是最安全的,但也费事儿,因为要将字节码混淆,打乱: 2.使用花指令,使得cla ...

  8. linux编译lame,技术|Linux 有问必答:如何在Linux中修复“fatal error: lame/lame.h: No such file or dir...

    提问: 我尝试着在Linux中编译视频编码器,但是编译提示出错:"fatal error: lame/lame.h: No such file or directory", 我该如 ...

  9. And roid下编译自己的库文件 jar并在应用中调用

    android编译系统的makefile文件Android.mk写法如下 (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要 ...

  10. linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用

    目录 Table of Contents 目录 一 源码编译和安装 添加opencv路径 二 增加并列子函数的方法 三 增加库函数形参的方法 四 cv增加子函数一些数据变量的问题 4.1 数据类型 一 ...

最新文章

  1. ueditor集成实例php,Laravel框架集成UEditor编辑器的方法图文与实例详解
  2. linux stress 命令 模拟系统高负载
  3. java并发的艺术-读书笔记-第八章常用的并发工具类
  4. Python基础(七)--模块和包
  5. php递归删除文件,PHP 递归删除文件夹
  6. 「mac版」支持flash的浏览器,谷歌浏览器Chrome、火狐浏览器Firefox
  7. 阿里云推出首个数据库云上跑分平台,背后是什么逻辑?
  8. 【Tomcat】Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
  9. gp3688写频线制作_摩托罗拉GP3688对讲机写频软件(摩托罗拉对讲机写频工具) 官方版...
  10. ubantu安装搜狗常见问题
  11. 谷歌浏览器flash插件离线下载,最新版
  12. 英语好文22.6.23
  13. Leetcode报错runtime error
  14. 使用canvas将多张图片合并为一张
  15. 日期计算(计算某一年的x天是几月几日)
  16. CTFshou wed命令执行29~50
  17. Python——解一元二次方程
  18. 数商云B2B分销商城系统:助力企业加快分销速度,构建高效智能B2B网上分销平台
  19. Ultra Mobile Paygo美国手机号教程
  20. 关于win10安装PingFangThin字体后换不回来的问题

热门文章

  1. c++调用powershell_告别 Windows 终端的难看难用,从改造 PowerShell 的外观开始
  2. 魅族 刷机android 6.0,魅族MX6如何刷机升级 魅族MX6升级方法【详解】
  3. AMS1117降压电路
  4. 新建scheme构建报错问题处理方案
  5. 使用粒子群PSO算法实现MPPT-M语言仿真
  6. 使Window注册表更改立刻生效的命令行命令
  7. H.264(MPEG)-4AVC
  8. 外螺纹对照表_螺纹符号对照表[1]
  9. JavaWeb和WebGIS学习笔记(七)——MapGuide Open Source安装、配置以及MapGuide Maestro发布地图——超详细!目前最保姆级的MapGuide上手教程!
  10. 什么是大数据挖掘技术