Java中怎么调用DLL方法(java,编程语言)

时间:2024-05-02 21:58:15 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

    Java%E4%B8%AD%E6%80%8E%E4%B9%88%E8%B0%83%E7%94%A8DLL%E6%96%B9%E6%B3%95

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方法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Hibernate 中删除出现异常如何解决下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18