请问在 JAVA Application 怎么调用其他程序写的.DLL动态连接库????请给实例说明,谢谢!小弟在线等,来者给分。
解决方案 »
- 关于异常捕捉的一个问题
- 急! 下载文件的Servlet如何重定向
- 求教更好的算法
- 使用org.apache.commons.net.ftp的Ftp类取文件时,文件名前面多了一个空格,不知道哪位知道为何?
- 可以把多个jar文件合并能一个么?
- 如果用户名=“admin”,密码="123456",则转发到show.jsp,否则跳转回登录页面index.jsp,求Servlet类代码?
- 英文不行呀,这是什么意思?如何做呢?先谢了
- i=i++问题
- 为什么applet重新编译后,在网页上刷新显示后还是原来的?
- ftpclient.put()方法谁用过?
- 向智侠求教:想作一个类似Gui设计器,用什么Swing组件能满足要求?
- 有关数据库连接的问题
网上很多的
搜索一下看
一门学问啊。可以看看Addison Welsey出版的The Java Native Interface书
在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++的头文件。 .
.
.
.
http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html
HelloNative.java:实用类,提供一个静态本地方法greeting(),打印出一个消息串。其中greeting方法调用了下面的本地代码。
HelloNative.c:本地实现代码。
HelloNativeTest.java:应用主文件,调用HelloNative实用类的greeting()方法。
HelloNative.java
//HelloNative.java
class HelloNative
{
public native static void greeting();
static
{
//HelloNative是下面将由HelloNative.c生成的dll文件。
System.loadLibrary("HelloNative");
}
}; 编译上面的.java文件后,在生成的.class目录下,使用javah命令生成HelloNative.class的C头文件:
javah HelloNative
HelloNative.h生成的HelloNative.h文件如下:/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */ #ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif
HelloNative.c
拷贝生成的HelloNative.h,另存为HelloNative.c,并填充JNICALL Java_HelloNative_greeting方法体,得到下面的
HelloNative.c: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative #define _Included_HelloNative
#ifdef __cplusplus extern "C" { #endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv * env, jclass cl)
{
printf("Hello, Native World!\n");
} #ifdef __cplusplus } #endif
#endif
使用Windows自带的c/c++编译器,编译上面的HelloNative.c:cl -Id:\j2sdk1.4.1\include -Id:\j2sdk1.4.1\include\win32 -LD HelloNative.c -FeHelloNative.dll执行这条命令后将生成HelloNative.dll文件。这个DLL动态链接库就是下面我们在HelloNative.java文件中调用的本地文件。如果是在Unix/Linux下,请使用相应操作系统的c编译器,生成的库文件是HelloNative.so。
开始运行吧至此,我们编写的Windows平台上的本地库文件和Java文件已经准备就绪,下面写一个简单的测试程序来测试一下本地调用吧。
class HelloNativeTest
{
public static void main(String[] args)
{
HelloNative.greeting();
}
}
编译、运行这个程序,将打印出Native版的:
Hello, Native World!也许你认为这并没有什么特别,但如果你知道这个消息串是使用你自己写的C库文件中调用生成的时候,你就会有知道这有着非常重大的意义。就好像寻宝者在人迹罕至的荒山之中,突然看到一块史前陶片,陶片本身并没有什么特别,但这,也许已经为你启开了宝藏之门。