精华内容
下载资源
问答
  • JAVA调用DLL JAVA调用DLLJAVA调用DLLJAVA调用DLLJAVA调用DLLJAVA调用DLL
  • java调用dll

    2012-03-29 12:55:59
    java调用dll
  • Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也带来跨平台性。使用JNI、Jawin和Jacb使得Java在Windows平台下使用COM和 DLL的更加方便。   Java语言本身具有跨平台性,如果通过Java调用...

    Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。使用JNI、Jawin和Jacb使得Java在Windows平台下使用COM和 DLL的更加方便。

     

    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]使用JNI技术实现JAVA程序调用dll、[JAVA]使用JNI技术实现JAVA程序调用dll
  • java jna 调用dll例子

    2015-04-16 18:50:06
    java 调用大华 SDK Dll 实现视频播放的例子
  • Java如何调用DLL

    2020-12-22 20:50:00
    1. 首先有testdll.dll   ...  —————————- Java调用开始 —————————  1. 建立一下 Java-Project工程,工程名随便起一个。  2. 要对应dll里面的接口,建立相对应的接口。
  • 这两天要弄个JAVA调用DLL,研究了一下有点绕, java部分要生成.h头文件,所以弄了个例子在这分享下 JAVA调用DLL完整步骤 步骤里包括java部分代码及vc写的DLL代码
  • JAVA 调用DLL

    2012-04-11 10:50:40
    java调用dll,附上源码
  • java调用DLL

    2012-07-02 22:13:06
    java调用DLL实例程序,使用的是开源JNative调用
  • 亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。
  • java 调用 dll

    2009-12-25 11:58:25
    java 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dlljava 调用dll
  • java 调用dll

    2012-11-23 08:31:01
    java 调用dll In this tutorial, I will try to explain how to call native functions which are written in C or C++ from Java, using JNI.
  • java连接调用dll动态库

    2013-05-28 10:27:08
    包含java调用dll动态库代码示例,使用的第三方工具插件。
  • JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单
  • JNA java调用dll

    2017-01-10 10:26:53
    java 调用dll 最简单的方式,完全不用开发c++代码,简单易用。
  • Java调用C#DLL

    2018-04-12 13:58:07
    该资源包含C#开发DLL源码,Java调用DLL源码,测试已通过
  • java调用DLL文件

    2014-05-29 19:57:42
    JAVA使用JNative包调用DLL文件
  • Java调用动态链接库 Java 调用 DLL 源码
  • Java调用_dll

    2013-09-28 12:48:38
    Java调用_dll文件
  • Java调用dll示例

    2016-01-15 16:17:52
    Java调用dll示例,Java命名方法,C++实现生成DLL供JAVA调用
  • DLL调用(3):Java JNA调用DLL

    千次阅读 2017-12-12 20:07:40
    Java调用C++的DLL方式很多,其中JNA方式是比较通用的一种。JNA(Java Native Access )提供一组Java工具类,可实现运行期动态访问系统本地库(native library)而不需要编写任何Native/JNI代码。程序需要在java接口...

    Java调用C++的DLL方式很多,其中JNA方式是比较通用的一种。JNA(Java Native Access )提供一组Java工具类,可实现运行期动态访问系统本地库(native library)而不需要编写任何Native/JNI代码。程序需要在java接口中描述目标native library的函数与结构,JNA即可自动实现Java接口到native function的映射。
    DLL定义与静态调用中一致,可以参考我的博客:http://blog.csdn.net/ezhchai/article/details/78784572
    在GitHub上下载JNA的jar包,https://github.com/java-native-access/jna/releases
    下载之后,取出zip中的jna.jar,本例中只用到了这个jar包。
    创建一个Java Project,在project中创建一个lib文件夹,将jna.jar加入到其中,project中右击jna.jar文件,Build Path->Add to Build Path加载jna.jar。
    将testDLL.dll文件拷贝到project中的src目录,在src中建立一个package。在其中先新建一个接口dllinterface.java。接口中首先还是载入DLL。

    dllInterface INSTANCE = (dllInterface) Native.loadLibrary("testDLL",dllInterface.class);

    在此之后,声明函数结构。

    public int Add(IntByReference a, IntByReference b);

    IntByReference对应int的指针。
    写完接口后,新建一个Java类DLLTest,用来调用DLL的功能。先生成一个接口实例。

    static dllInterface tdll = dllInterface.INSTANCE;

    然后即可在主函数中调用DLL功能了。

    int c = tdll.Add(aa, bb);

    JNA可以让你像调用一般java方法一样直接调用本地方法。就和直接执行本地方法差不多,而且调用本地方法还不用额外的其他处理或者配置什么的,也不需要多余的引用或者编码,使用很方便。但JNA的效率是比较低的,运行速度慢,这一点则引出了后续文章的方法~

    完整示例代码可在http://download.csdn.net/download/ezhchai/10155924中下载,起名字为“最简单的JNA调用DLL”,致敬那个勤奋刻苦的“雷神”。

    展开全文
  • Java调用DLL.rar

    2020-06-19 11:46:05
    Java调用DLL.rar
  • java调用dll方法总结

    2020-08-28 11:04:22
    本篇文章小编给大家整理了java调用dll的方法的总结,有需要的朋友参考学下一下吧。
  • Java调用DLL源代码

    热门讨论 2016-05-26 09:59:29
    Java调用DLL源代码JNA和JNative
  • Java JNA方式调用dll/so方法Windows环境下调用dllLinux环境下调用so兼容Windows环境和Linux环境 Windows环境下调用dll 首先,将dll文件放在项目的resources目录的根目录下,以“libtest.dll”为例,拷贝至项目...

    引入Jar包或者下载Jar包导入项目

            <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>5.5.0</version>
            </dependency>
    

    Windows环境下调用dll

    首先,将dll文件放在项目的resources目录的根目录下,以“libtest.dll”为例,拷贝至项目resources目录。

    public class TestSo {
        public interface CLibrary extends Library {
        	//使用loadLibrary相对路径
            CLibrary INSTANCE = (CLibrary) Native.loadLibrary("libtest",CLibrary.class);
            int add(int a,int b);//dll提供的方法
        }
        public int add(int a,int b){
            return CLibrary.INSTANCE.add(a,b);
        }
        public static void main(String[] args) {
            TestSo ts = new TestSo();
            int c = ts.add(10,20);
            System.out.println("10+20="+c);
        }
    }
    

    注意:

    • 编译dll时,确认32位/64位运行环境
    • 加载库文件时,不带dll后缀

    Linux环境下调用so

    首先,把libtest.so库文件上传至机器的某个路径下,比如“/usr/local/lib”,将“/usr/local/lib”添加至环境变量。

    # vim /etc/profile
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
    # source /etc/profile
    # echo LD_LIBRARY_PATH
    

    编写Java代码

    public class TestSo {
        public interface CLibrary extends Library {
            CLibrary INSTANCE = (CLibrary) Native.loadLibrary("test",CLibrary.class);
            int add(int a,int b);//so提供的方法
        }
        public int add(int a,int b){
            return CLibrary.INSTANCE.add(a,b);
        }
        public static void main(String[] args) {
            TestSo ts = new TestSo();
            int c = ts.add(10,20);
            System.out.println("10+20="+c);
        }
    }
    

    注意:

    • 加载的库文件名为“test”,不是“libtest”
    • 加载的库文件不带so的后缀

    兼容Windows环境和Linux环境

    需要注意Windows环境下和Linux环境下的加载库文件的名称不一样。

    public class TestSo {
        public interface CLibrary extends Library {
            CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "libtest" : "test"), CLibrary.class);
            int add(int a,int b);
        }
        public int add(int a,int b){
            return CLibrary.INSTANCE.add(a,b);
        }
        public static void main(String[] args) {
            TestSo ts = new TestSo();
            int c = ts.add(10,20);
            System.out.println("10+20="+c);
        }
    }
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,581
精华内容 23,832
关键字:

java能调用dll

java 订阅