zoukankan      html  css  js  c++  java
  • Java调用DLL有多种方式,常用的方式有JNative、JNA、JNI等。

    JNative方式调用dll

    JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用DLL,会不会在效率方面很不如人意,我可以用我使用Jnative的经验告诉你,不会!因为我用Jnative就是用来处理大量的数据调用,是基于实时数据库接口的调用。而实时数据库的数据量是非常大的。

    首先下载JNative

    注意:将JNative解压,并将其中的JNativeCpp.dll拷贝到system32文件夹中,libJNativeCpp.so是linux平台使用的。

    代码:

    [java] view plain copy

    1. package com.tvjody; 
    2. import org.xvolks.jnative.JNative; 
    3. import org.xvolks.jnative.exceptions.NativeException; 
    4. import org.xvolks.jnative.util.Kernel32.SystemTime; 
    5. public class Demo { 
    6. public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException { 
    7. // Kernel32.dll为dll名称,Kernel32目录的位置为:C:WindowsSystem32下面,
    8. // GetSystemTime为Kernel32.dll中的一个方法.
    9.         JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime"); 
    10.         SystemTime systemTime = new SystemTime(); 
    11. // 设置参数
    12.         nGetSystemTime.setParameter(0, systemTime.getPointer()); 
    13.         nGetSystemTime.invoke(); 
    14. // 解析结构指针内容
    15. return systemTime.getValueFromPointer(); 
    16.     } 
    17. public static void main(String[] args) throws NativeException, IllegalAccessException { 
    18.         System.err.println(GetSystemTime()); 
    19.         System.exit(0); 
    20.     } 
    JNA方式调用dll

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。

    首先下载JNA

    代码:

    [java] view plain copy

    1. package com.tvjody; 
    2. import com.sun.jna.Library; 
    3. import com.sun.jna.Native; 
    4. import com.sun.jna.Platform; 
    5. public class JNA { 
    6. // 定义接口CLibrary,继承自com.sun.jna.Library
    7. public interface testdll extends Library { 
    8. // msvcrt为dll名称,msvcrt目录的位置为:C:WindowsSystem32下面,
    9.         testdll Instance = (testdll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), 
    10.                 testdll.class); 
    11. // printf为msvcrt.dll中的一个方法.
    12. void printf(String format, Object... args); 
    13.     } 
    14. public static void main(String[] args) { 
    15. // 调用printf打印信息
    16.         testdll.Instance.printf("yyyyMMdd"); 
    17.     } 
    JNI调用dll

    如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的dll/so中公布的函数。
    然后再在Java中载入这个适配器dll/so,再编写Java   native函数作为dll中函数的代理。经过2个繁琐的步骤才能在Java中调用本地代码。
    因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点!只提供几个链接吧!

    http://blog.sina.com.cn/s/blog_6c3b9ed40100xyl8.html
    http://www.open-open.com/home/space-37924-do-blog-id-5681.html

    以上源代码下载

  • 相关阅读:
    android120 zhihuibeijing 开机页面
    Android View.onMeasure方法的理解
    android119 侧滑菜单
    android事件拦截处理机制详解
    Android应用在不同版本间兼容性处理
    虚拟机重置密码
    ESXi虚拟机开机进入bios的方法
    [日常工作]Win2008r2 以及更高版本的操作系统安装Oracle10.2.0.5
    Linux下安装oracle的过程
    Oracle18c Exadata 版本安装介质安装失败。
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/8668801.html
Copyright © 2011-2022 走看看