java如何调用dll 如何生成头文件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在JAVA程序中,首先需要在类中声明所调用的库名称,如下:static {System.loadLibrary(“goodluck”);}在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:public native static void set(int i);public native static int get();然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。例如程序testdll.java,内容为:public class testdll{ static { System.loadLibrary("goodluck"); } public native static int get(); public native static void set(int i); public static void main(String[] args) { testdll test = new testdll(); test.set(10); System.out.println(test.get()); }}用javac testdll.java编译它,会生成testdll.class。再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。 用JNI调用C或C++动态联接库原来如此简单因工作的缘故,有机会接触了Java本地方法调用(JNI)。本文中记下了初试JNI的过程和一点点体会。使用Java的JNI调用C/C++的动态联结库有个固定的步骤,下面将以一个最简单的HelloWorld例子程序来说明调用过程。这个HelloWorld的例子只是简单的显示HelloWorld消息。 第一步 编写Java类首先,我们创建一个名为jnitest的Eclipse工程,并新建一个src源代码目录。这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLL。HelloWorld类包含一个本地方法displayHelloWorld(),TestDLL用于测试这个本地方法。HelloWorld的源码清单如下:List1. HelloWorld.java源码public class HelloWorld { public native void displayHelloWorld();① static{ System.loadLibrary("HelloWorld"); ② }}TestDLL源码如下:List2. TestDLL.java源码public class TestDLL { public static void main(String[] args){ HelloWorld helloWorld = new HelloWorld(); helloWorld.displayHelloWorld(); }}说明:①是java本地方法申明;②装入动态链接库,"HelloWorld"是要装入的动态链接库名称。 第二步 编译Java类在Eclipse工具中编译Java类。编译后的class文件会自动放入工程目录下的bin目录中。第三步 生成C/C++头文件在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:List3. HelloWorld.h源码/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif注意,不要修改这个头文件。第四步 编写本地方法实现用VC6创建HelloWorld Win32动态链接库工程。将上述生成的头文件HelloWorld.h拷贝到D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目录下面。将D:\j2sdk1.4.2\include目录下的jni.h和D:\j2sdk1.4.2\include\win32\jni_md.h两个头文件拷贝到VC安装目录下的D:\Program Files\Microsoft Visual Studio\VC98\Include目录下面。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译生成DLL。 List4. HelloWorld.cpp源码#include "HelloWorld.h" #include <stdio.h> /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject) { printf("Hello World!\n"); return;}第五部 运行测试程序先将生成的DLL拷贝到jnitest工程的D:\workspace\jnitest\bin下面,然后设置DLL搜索路径(环境变量PATH)为D:\workspace\jnitest\bin(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可)③。重新启动Elipse后,运行测试程序,将看到控制台输出“Hello World!”注意,③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面。这里,我折腾了不少时间,才搞定。 在JAVA程序中,首先需要在类中声明所调用的库名称,如下: static { System.loadLibrary(“goodluck”); } 在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。 还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下: public native static void set(int i); public native static int get(); 然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。 例如程序testdll.java,内容为: public class testdll { static { System.loadLibrary("goodluck"); } public native static int get(); public native static void set(int i); public static void main(String[] args) { testdll test = new testdll(); test.set(10); System.out.println(test.get()); } } 用javac testdll.java编译它,会生成testdll.class。 再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。 优化一段java代码考虑不用PreparedStatement 有关继承中变量的问题? 求教一个基础问题 想不通的swing问题 请教一下:怎么用java调用IE来打开html文档? 帮忙写一个字数统计的小程序。 高手请进! 急:请问一个输入的问题???? 急寻THING IN JAVA 英文版!! 为什么中文字符串在GridControl中显示不出来,可是在其他控件,如TextField中就是正常的? 求教,JAVA初学者问题 算法问题:这段程序如何加密的?
System.loadLibrary(“goodluck”);
}在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:public native static void set(int i);
public native static int get();然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:public class testdll
{
static
{
System.loadLibrary("goodluck");
} public native static int get(); public native static void set(int i); public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
因工作的缘故,有机会接触了Java本地方法调用(JNI)。本文中记下了初试JNI的过程和一点点体会。使用Java的JNI调用C/C++的动态联结库有个固定的步骤,下面将以一个最简单的HelloWorld例子程序来说明调用过程。这个HelloWorld的例子只是简单的显示HelloWorld消息。
第一步 编写Java类
首先,我们创建一个名为jnitest的Eclipse工程,并新建一个src源代码目录。这里我们编写两个Java类,一个命名为HelloWorld,一个命名为TestDLL。HelloWorld类包含一个本地方法displayHelloWorld(),TestDLL用于测试这个本地方法。HelloWorld的源码清单如下:
List1. HelloWorld.java源码
public class HelloWorld { public native void displayHelloWorld();① static{ System.loadLibrary("HelloWorld"); ② }}
TestDLL源码如下:
List2. TestDLL.java源码public class TestDLL { public static void main(String[] args){ HelloWorld helloWorld = new HelloWorld(); helloWorld.displayHelloWorld(); }}说明:①是java本地方法申明;②装入动态链接库,"HelloWorld"是要装入的动态链接库名称。
第二步 编译Java类
在Eclipse工具中编译Java类。编译后的class文件会自动放入工程目录下的bin目录中。
第三步 生成C/C++头文件
在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:
List3. HelloWorld.h源码
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class HelloWorld */#ifndef _Included_HelloWorld#define _Included_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
注意,不要修改这个头文件。第四步 编写本地方法实现
用VC6创建HelloWorld Win32动态链接库工程。将上述生成的头文件HelloWorld.h拷贝到
D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目录下面。将D:\j2sdk1.4.2\include目录下的jni.h和D:\j2sdk1.4.2\include\win32\jni_md.h两个头文件拷贝到VC安装目录下的D:\Program Files\Microsoft Visual Studio\VC98\Include目录下面。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译生成DLL。
List4. HelloWorld.cpp源码
#include "HelloWorld.h" #include <stdio.h>
/* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject) { printf("Hello World!\n"); return;}
第五部 运行测试程序先将生成的DLL拷贝到jnitest工程的D:\workspace\jnitest\bin下面,然后设置DLL搜索路径(环境变量PATH)为D:\workspace\jnitest\bin(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可)③。重新启动Elipse后,运行测试程序,将看到控制台输出“Hello World!”注意,③必须设置好DLL搜索路径,或者将dll拷贝到C:\WINDOWS\system32下面。这里,我折腾了不少时间,才搞定。
System.loadLibrary(“goodluck”);
} 在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下: public native static void set(int i);
public native static int get(); 然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为: public class testdll
{
static
{
System.loadLibrary("goodluck");
} public native static int get(); public native static void set(int i); public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
} 用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。