2015-06-17 16:30:44 u013166918 阅读数 851

准备工作:

1.要有jnative.jar包

2.JNativeCpp.dll 文件放入到system32目录和本地工程目录下;

3.test.dll文件放入system32目录和本地工程目录下;

注:tomcat发布项目要将*.dll文件放入到tomcat的bin目录下。

一些遇到的问题:

报错信息DLL 。。。not found可能就是你的.dll文件没有放到相应的目录,见准备工作。

报错信息function not found是在你的.dll文件中没有找到这个方法。

2009-06-09 13:15:00 dsj188 阅读数 2743

Java工程:


1.JNativeCpp.dll 文件放入到system32目录和本地工程目录下;


2.test.dll(自己编写的dll)放入到system32目录和本地工程目录下;经测试:JNative调用动态链接库,需要把该dll放置在system32下,本地工程目录下无需放置,系统会自动到System32目录下寻找。)


3.加入test.dll文件中应用到了一些*.dat文件,需要将这些文件放置到jdk的bin目录下;


4.加入test.dll文件中应用到得一些*.lib 文件,需要将这些文件放置到jdk的根目录下;


5.JNative.jar放置在工程的目录下;

 

Web工程:(以Tomcat为例)


1.JNativeCpp.dll 文件放入到system32目录,本地工程目录下和Tomcat的bin目录下;


2.JNative.jar放置在工程的目录和Tomcat的lib目录下;


3.加入test.dll文件中应用到了一些*.dat文件,需要将这些文件放置到jdk的bin目录下;


4.加入test.dll文件中应用到得一些*.lib 文件,需要将这些文件放置到jdk的根目录下;


5.test.dll(自己编写的dll)放入到system32目录和本地工程目录下;经测试:JNative调用动态链接库,需要把该dll放置在system32下,本地工程目录下无需放置,系统会自动到System32目录下寻找。)

 

以上的路径问题是自己在多次试验中总结出来的,如果路径不正确,将会引发各种各样的错误,是在是非常的郁闷,希望以上的路径能够对大家有所帮助,如果有什么错误,希望大家指正并共同学习。

 

 

版权所有,转载请表明文章出处http://blog.csdn.net/dsj188/archive/2009/06/09/4254467.aspx

2012-05-08 22:38:26 ap0806223 阅读数 2430

因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档。在网上找到一个开源的组件JNative,使用后感觉比较方便。

  • 下截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中或将其拷贝到jdk\jre\lib\ext 下,系统会自动加载。

  • 使用说明

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

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

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

    java 代码
    1. package com.tvjody;   
    2.   
    3. import java.io.File;   
    4. import java.io.FileOutputStream;   
    5. import java.io.IOException;   
    6. import java.io.InputStream;   
    7.   
    8. import org.xvolks.jnative.JNative;   
    9. import org.xvolks.jnative.Type;   
    10. import org.xvolks.jnative.exceptions.NativeException;   
    11.   
    12. public class AppSvrTestConnect {   
    13.   
    14.     public AppSvrTestConnect() {   
    15.   
    16.     }   
    17.        
    18.     /**  
    19.      * 测试应用服务器连接状态  
    20.      *   
    21.      *  TestConnect   
    22.      * @param ip 应用服务器IP  
    23.      * @param port 端口  
    24.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    25.      * @return int 1 :成功 0:失败  
    26.      * @throws NativeException  
    27.      * @throws IllegalAccessException  
    28.      */  
    29.     private static final int TestConnect(String ip, int port, int intrcpt)throws NativeException, IllegalAccessException {   
    30.         JNative n = null;   
    31.         try {              
    32.             n = new JNative("TestAppSvr.dll""TestConnect");   
    33.             n.setRetVal(Type.INT);   
    34.             int i = 0;   
    35.             n.setParameter(i++, Type.STRING, ip);   
    36.             n.setParameter(i++, Type.INT, "" + port);   
    37.             n.setParameter(i++, Type.INT, "" + intrcpt);   
    38.             n.invoke();   
    39.             return Integer.parseInt(n.getRetVal());   
    40.         } finally {   
    41.             if (n != null)   
    42.                 n.dispose();   
    43.         }   
    44.     }   
    45.     /**  
    46.      * 指定Dll文件路径,动态加载本地链接库,测试应用服务器连接状态  
    47.      * setDllPath  
    48.      * @param path Dll文件的路径,不包含DLL名称 例如:windows - d:\test\test\ unix - root/test/test/  
    49.      * @param ip 应用服务器IP  
    50.      * @param port 端口  
    51.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    52.      * @return int 1 :成功 0:失败  
    53.      * @throws NativeException  
    54.      * @throws IllegalAccessException  
    55.      */  
    56.     public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{   
    57.         path += "TestAppSvr.dll";   
    58.         System.load(path);   
    59.         return TestConnect(ip,port,intrcpt);   
    60.     }   
    61.     /**  
    62.      * Dll文件放在JRE\bin目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库  
    63.      * TestConnectFromDllPath  
    64.      * @param ip 应用服务器IP  
    65.      * @param port 端口  
    66.      * @param intrcpt  是否采用数据压缩方式 1 :true 0:false  
    67.      * @return int 1 :成功 0:失败  
    68.      * @throws NativeException  
    69.      * @throws IllegalAccessException  
    70.      */  
    71.     public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{   
    72.         System.loadLibrary("TestAppSvr");   
    73.         return TestConnect(ip,port,intrcpt);   
    74.     }   
    75. }  

    这个类实现了一个静态私有方法,用来调用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放在了Jre\bin目录下,在JVM的Classloader的时候会自动加载,然后通过System.loadLibrary("TestAppSvr")就可以装配DLL文件.

java 代码
  1. public class Demo {   
  2.     public int getInfo() throws NativeException, IllegalAccessException{   
  3.            
  4.         String path=getClass().getResource(File.separator).getPath();          
  5.         path = path.substring(1,path.length());   
  6.         System.out.println(path);   //得到DLL文件的路径   
  7.            
  8.         String ip = "192.168.0.48"//服务器IP   
  9.         int port = 221;             //端口   
  10.         int intrcpt = 1;            //数据压缩方式传送,1为采用;0为不采用   
  11.         //方法1 传入Dll文件的路径   
  12.         //int info = AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);   
  13.            
  14.         //方法2 Dll文件已经放在JRE\bin目录下面   
  15.         int info = AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);   
  16.            
  17.         //1为成功,0为失败   
  18.         if (info == 1)   
  19.             System.out.println("应用服务器可用。");   
  20.         else  
  21.             System.out.println("应用服务器不可用,请检查IP地址和端口是否正确。");   
  22.            
  23.         return info;   
  24.     }   
  25.       


 System.loadLibrary():装载Windows\System32下或jre\bin或Tomcat\bin目录下的本地链接库

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

 

  • 备注

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

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

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

2019-04-23 11:34:12 qq_36874292 阅读数 480

本文采用JNA调用DLL

note:个人尝试过JNI,Jnative,等其他调用方式.总而言之 繁琐,不适合Java吧.或者不适合小编,这里只推荐JNA,核心代码三行搞定调用DLL.

jnative好用,但是文件路径等等还是有问题,不能像java一样去使用。也不推荐

jna调用,意外之喜很好用的。貌似是对Jnative进行了封装.可以自行研究一下,之前研究的 忘了…

.

step1 JNA Maven 仓库引入

注意事项:java调用dll 需要jdk32位版本

		// 版本自己去Maven仓库搜 一般用最新版本的上1-2个版本
		<dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>4.1.0</version>
        </dependency>

.

step2 将DLL构造成interface

@Component
public class sendEdiByJnaforJobId {
	
	// 接口名字 我直接写的 DLL文件名
	public interface EDI_Middleware extends Library {
	
		// 加载DLL  StaticConstant.EDI_MIDDLEWARE_DLL 这是DLL路径,你可以直接放在 项目Resource下,直接写DLL名字即可调用,也可指定路径C:\\ddd\\xxx.....
		EDI_Middleware INSTANCE = (EDI_Middleware)Native.loadLibrary(StaticConstant.EDI_MIDDLEWARE_DLL, EDI_Middleware.class);
		
		// DLL文件对应的方法名 这些函数名字,返回值 必须跟你的DLL是一致的,不能随意写.不然JNA反射是找不到你的方法的. 你可以直接把DLL中的函数名字粘贴 过来.
		void initial_DM();
		
		// DLL文件对应的方法名
		int gen_edi2carrier(Integer java,Double a);
		
	}
	
	// 自己封装了一个work方法调用DLL
	public void work(Long jobId) {
		
		Double jobD=jobId.doubleValue();
		int java=0;
		// DLL调用 方式一  调用完 不关闭DLL
//		EDI_Middleware.INSTANCE.initial_DM();
//		int a=EDI_Middleware.INSTANCE.gen_edi2carrier(java,jobD);
//		System.out.println(a);
		try {
		//  DLL调用 方式二 调用完 关闭DLL
			NativeLibrary instance = NativeLibrary.getInstance(StaticConstant.EDI_MIDDLEWARE_DLL);
			instance.getFunction("initial_DM").invoke(new Object[]{});
			instance.getFunction("gen_edi2carrier").invokeDouble(new Object[]{java,jobD});
			instance.dispose();
		}catch (Exception e){
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("static-access")
	public static void main(String[] args) {
		// 我用 组件扫描到容器了 我可以@autowired 调用
		sendEdiByJnaforJobId aaaa=new sendEdiByJnaforJobId();
		long aaa1=4106465; // 4099988
		aaaa.work(aaa1);
	}
}

是不是很简单,最重要的就是构造 与DLL与之对应的接口类.

简而言之,jna需要自己定义java接口,这个类的方法和dll文件一样,你必须十分清楚dll文件的结构和里面的方法以及返回值,参数。
将DLL映射成Java 接口.这样JNA在调用时反射生成实现类,这样就可以随心随意用我们的java进行调用了.

step3 小结一下

释放DLL也是自己反射生成的,JNA没有提供显示调用close DLL.本人参照了的显示调用DLL,进了源码看见作者是用NativeLibrary进行Close的,所以我就反射 自己生成 自己关闭DLL.

Java调用DLL不难 大家不会灰心.

2017-11-28 23:01:07 shenjixiang 阅读数 3136

常用的就是jni,jnative(基于jni封装了自己的jar包)
注意:java调用dll,必须dll里做了对应的处理。列如:方法名必须为_java_包名_类名_方法名

使用JNI调用dll步骤

  • 新建一个java项目,将dll文件放入src下
  • 配置改项目环境jre下native目录,指向src
  • 项目jdk一定不要用eclipse自带的,用自己安装的jdk路径
  • 按照dll里的目录顺序新建目录及类
  • 声明跟dll里一样的方法,方法前加native关键字(注意参数类型)
  • 代码静态块里写(不要后缀):
static {
    System.loadLibrary("testDll");
}
  • 之后写main方法就可以调用了。如有报错,注意观察报错信息,可能会缺少依赖dll文件

简单封装JNI

  • 简单封装一个调用dll的类
  • 代码可以在资源共享,我的代码中下载
  • 调用代码(主要是static块代码变了),DllUtil这块代码在共享里下载
static {
    try {
        DllUtil.extractFromJar("testDll.dll", "testDll.dll", System
                .getProperty("java.io.tmpdir"));
        System.load(System.getProperty("java.io.tmpdir") + "\\testDll.dll");
        System.out.println("load testDll.dll success!!");
    } catch (Exception e) {
        System.out.println("testDll.dll error:" + e.getMessage());
    }
}

java调用dll

阅读数 965

没有更多推荐了,返回首页