欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java调用dll文件

程序员文章站 2022-06-03 20:45:19
...

在java中调用C/C++写的dll库文件的步聚如下:

 

1. 建立一个java project ,然后新建一个类代码如下:

 

 

package com.lib;

public class TestMylib {
	
	static{
		System.loadLibrary("TestMylib");
	}
	
	public native int add(int a, int b);    
	
	public static void main(String args[]){
		
		int a = 1;        
	    int b = 5;
	    int c = 0;
	    TestMylib test1 = new TestMylib();   
	    c = test1.add(a,b);
	    
	    System.out.println("c = " + c);
		
	}
}

 

2. 然后利用javah 根据上面类的.class 文件生成 *.h 文件,如:javah com.lib.TestMylib   这里的路径一定要是.class文件的路径。

 

3. 在vc++的开发环境中新建一个动态连结库工程,然后把生成的*.h文件添加到工程中,然后把jdk中的 jni.h、 jni_md.h  添加到工程中,然后在工程中实现调用的函数。

 

4. 编译生成dll库文件。

 

5. 然后把生成的dll文件复制到java project的根目录下。

 

6. 运行java项目,得如下结果,表示成功

 

 

c = 6

 

注意:如果在命令行中运行带有包名的文件,我还没有实验成功,总是打不到dll文件,感觉dll的文件的位置放的不正确, 一直没有解决。

 

另外:

   1. 如下出现下列错误,表示dll文件的位置没有放正确。

Exception in thread "main" java.lang.NoClassDefFoundError: com\lib\TestMylib (wrong name: com/lib/TestMylib)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
1)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: com\lib\TestMylib.  Program will exit.

 

2. 如果出现下列错误,则是方法名拼写有错误与使用javah生成的 .h 文件中的不一致。

 

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.lib.TestMylib.add(II)I
	at com.lib.TestMylib.add(Native Method)
	at com.lib.TestMylib.main(TestMylib.java:17)
 

注意:现在有一些开源的工具,可以实现此功能,比这个要简单,如jacob, jawin等开源软件

相关标签: java