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等开源软件
上一篇: Linux下创建用户并设置密码