Java调用.dll文件的方法

谪铺餐瓤44

谪铺餐瓤44

2016-02-19 10:51

下面请跟着图老师小编一起来了解下Java调用.dll文件的方法,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

下截JNative组件

jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2

解压JNative-st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899"1.3.2/st1:chsdate.zip

获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。
JNativeCpp.dll Windows下用的,拷贝到windows / system32目录下;
libJNativeCpp.so Linux下的,拷贝到系统目录下;
JNative.jar 这是一个扩展包,导入工程LIB中或将其拷贝到jdkjrelibext 下,系统会自动加载。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

•使用说明

我的项目将使用JNative组件调用一个测试应用服务器状态的TestAppSvr.dll文件,Dll文件中包含一个TestConnect()方法,返回一个整形的结果(1或0)

首先配置好JNative组件的windows环境:
将Native要用到JNativeCpp.dll放在系统盘的WINDOWSsystem32下

将JNative.jar导入工程中,新建一个调用类:

java 代码
代码如下:

package com.tvjody;  

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  

import org.xvolks.jnative.JNative;  
import org.xvolks.jnative.Type;  
import org.xvolks.jnative.exceptions.NativeException;  

public class AppSvrTestConnect {  

    public AppSvrTestConnect() {  

    }  

    /** 
     * 测试应用服务器连接状态 
     *  
     *  TestConnect  
     * @param ip 应用服务器IP 
     * @param port 端口 
     * @param intrcpt  是否采用数据压缩方式 1 :true 0:false 
     * @return int 1 :成功 0:失败 
     * @throws NativeException 
     * @throws IllegalAccessException 
     */ 
    private static final int TestConnect(String ip, int port, int intrcpt)throws NativeException, IllegalAccessException {  
        JNative n = null;  
        try {             
            n = new JNative("TestAppSvr.dll", "TestConnect");  
            n.setRetVal(Type.INT);  
            int i = 0;  
            n.setParameter(i++, Type.STRING, ip);  
            n.setParameter(i++, Type.INT, "" + port);  
            n.setParameter(i++, Type.INT, "" + intrcpt);  
            n.invoke();  
            return Integer.parseInt(n.getRetVal());  
        } finally {  
            if (n != null)  
                n.dispose();  
        }  
    }  
    /** 
     * 指定Dll文件路径,动态加载本地链接库,测试应用服务器连接状态 
     * setDllPath 
     * @param path Dll文件的路径,不包含DLL名称 例如:windows - d:testtest unix - root/test/test/ 
     * @param ip 应用服务器IP 
     * @param port 端口 
     * @param intrcpt  是否采用数据压缩方式 1 :true 0:false 
     * @return int 1 :成功 0:失败 
     * @throws NativeException 
     * @throws IllegalAccessException 
     */ 
    public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{  
        path += "TestAppSvr.dll";  
        System.load(path);  
        return TestConnect(ip,port,intrcpt);  
    }  
    /** 
     * Dll文件放在JREbin目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库 
     * TestConnectFromDllPath 
     * @param ip 应用服务器IP 
     * @param port 端口 
     * @param intrcpt  是否采用数据压缩方式 1 :true 0:false 
     * @return int 1 :成功 0:失败 
     * @throws NativeException 
     * @throws IllegalAccessException 
     */ 
    public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{  
        System.loadLibrary("TestAppSvr");  
        return TestConnect(ip,port,intrcpt);  
    }  
}

这个类实现了一个静态私有方法,用来调用Dll文件中的方法返回结果

private static final int TestConnect(String ip, int port, int intrcpt)

两个静态公共方法,分两种方式装载DLL文件

public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt)  //通过DLL文件的路径
public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) //通过ClassLoader             然后新建一个类,调用AppSvrTestConnect.java,实现方法一调用,我是将TestAppSvr.dll文件与Demo.java放在一个目录下 ,所以得到Demo.java的路径后就可以得到TestAppSvr.dll的路径,调用AppSvrTestConnect.TestConnectFromDllPath()方法后就能返回正确的信息.方法二是已经将TestAppSvr.dll放在了Jrebin目录下,在JVM的Classloader的时候会自动加载,然后通过System.loadLibrary("TestAppSvr")就可以装配DLL文件.

java 代码
代码如下:

public class Demo {  
    public int getInfo() throws NativeException, IllegalAccessException{  

        String path=getClass().getResource(File.separator).getPath();         
        path = path.substring(1,path.length());  
        System.out.println(path);   //得到DLL文件的路径  

        String ip = "192.168.0.48"; //服务器IP  
        int port = 221;             //端口  
        int intrcpt = 1;            //数据压缩方式传送,1为采用;0为不采用  
        //方法1 传入Dll文件的路径  
        //int info = AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);  

        //方法2 Dll文件已经放在JREbin目录下面  
        int info = AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);  

        //1为成功,0为失败  
        if (info == 1)  
            System.out.println("应用服务器可用。");  
        else 
            System.out.println("应用服务器不可用,请检查IP地址和端口是否正确。");  

        return info;  
    }  

System.loadLibrary():装载WindowsSystem32下或jrebin或Tomcatbin目录下的本地链接库

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

System.load():根据具体的目录来加截本地链接库,必须是绝对路径

•备注

上面的示例工程,因为是例子,所以没有大多的设计,只是实现了装载DLL文件,调用DLL文件方法,返回信息.

JNative的详细说明,请参考JNative的源程序和例子.

注意JVM只允许一个默认的ClassLoader来load native library,同时并不提供专门的API来unload一个loaded native library,所以在项目调试的时候,独立启动Web Server.

展开更多 78%)
分享
qqQQ
qzoneQQ空间
weibo微博

猜你喜欢

Java调用.dll文件的方法

编程语言 网络编程
Java调用.dll文件的方法

调用DLL文件中的FORM

编程语言 网络编程
调用DLL文件中的FORM

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在ASP文件中调用DLL

ASP
在ASP文件中调用DLL

用java实现外部调用exe文件

编程语言 网络编程
用java实现外部调用exe文件

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java中如何调用cmd压缩文件

编程语言 网络编程
Java中如何调用cmd压缩文件

Java:DocumentBuilderFactory调用XML的方法实例

编程语言 网络编程
Java:DocumentBuilderFactory调用XML的方法实例

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

一招巧治Windows7双硬盘自动关闭顽疾

一招巧治Windows7双硬盘自动关闭顽疾

JAVASCRIPT HashTable

JAVASCRIPT HashTable
下拉加载更多内容 ↓