java调用c编写的dll库的问题? 我在用JAVA调用COM的时候也遇到这个问题,也是束手无策。不过我调用普通的DLL是成功的,用的是APPLICATION方法见下面其实THINKING IN JAVA讲的很好啦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Java Native API Demo本文档使用一个简单例子演示一下如何使用Java Native API。程序的功能:用户输入直角三角形的两个直角边,程序输出斜边的长度。步骤:1:编写Java类:类名:NativeTest.javaclass NativeTest{ public static void main(String [] args) { NativeTest aTest=new NativeTest(); int i0=Integer.valueOf(args[0]).intValue(); int i1=Integer.valueOf(args[1]).intValue(); double d=aTest.nativeHypotenuse(i0,i1); System.out.println("the value for the Hypotenuse for a triangle of sides "+args[0]+" and "+args[1]+ " is "+d); } public native double nativeHypotenuse(int i,int j); static { System.loadLibrary("NativeTest"); }}说明:1、 在该Java类的main函数中,首先生成该类的一个实例,然后接受两个参数做为直角三角形的两个直角边,然后调用一个Native方法:nativeHypotenuse,计算直角三角形的斜边。该方法使用C语言实现。2、 调用Native方法nativeHypotenuse的方式同调用Java类的其他方法完全相同。如:double d=aTest.nativeHypotenuse(i0,i1);3、 在Java的类文件中,首先要声明一个Native方法,方式如下:public native double nativeHypotenuse(int i,int j);在该方法中不包含任何代码(具体代码在C语言中实现,并且作为DLL提供),并且在方法的声明之后紧跟一个分号。4、 为了确保Java虚拟机在首次使用该类的时候将DLL装载到内存,需要在包含这个Native方法的类中使用静态初始化程序块。本例中为: static { System.loadLibrary("NativeTest"); } 其中NativeTest为DLL文件的名字2:使用javah在DOS窗口中运行: javah –jni NativeTest 运行上述命令之后,在当前目录中生成一个C语言的头文件:NativeTest.h。/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class NativeTest */#ifndef _Included_NativeTest#define _Included_NativeTest#ifdef __cplusplusextern "C" {#endif/* * Class: NativeTest * Method: nativeHypotenuse * Signature: (II)D */JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus}#endif#endif在该文件中,javah程序会生成一个函数声明:JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse(JNIEnv *, jobject, jint, jint);3:在当前目录中,创建一个文本文件:NativeTest.c,在该文件中,首先要引用全面由javah产生的头文件:#include "NativeTest.h"然后将上面的函数声明拷贝到该文件中。之后就可以根据自己的目的实现该函数。在本例中,因为要使用C函数库中的方法,所以要包含头文件<math.h>。具体代码如下:NativeTest.c#include "NativeTest.h"#include <math.h>JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse(JNIEnv *env, jobject obj, jint i, jint j){ return sqrt(i*i + j*j);}3、编译动态连接库1、 要想编译成动态连接库,首先要安装VC++和JDK。2、 假设 JDK安装在系统的D:\jdk117\目录下。3、 在DOS窗口中运行:D:\Jdk117\demo\native\test>cl -Id:\jdk117\include -Id:\jdk117\include\win32 –LD NativeTest.c -FeNativeTest.dll其中CL为VC++的编译程序。程序运行后,在当前目录中生成动态连接库NativeTest.dll4、编译并运行在DOS窗口中运行:javac NativeTest.javajava NativeTest 3 4可以得到输出结果:the value for the Hypotenuse for a triangle of sides 3 and 4 is 5.0 我不懂你是什么意思。你应该根据。H文件的函数名来写函数啊!为什么说你的DLL头文件跟JAVA不同啊??写JNI程序的过程你要自己看看JAVA的JNI说明了! 你可以自己写一个dll,里面的函数用来调用你手头上的dll里的函数,你的java程序调用你自己的dll里的函数就可以了 现在的问题并不是简单的调用dll的问题, 而问题在于用jre1.1里面的jrew就可以轻松调用并且运行这个程序的主类文件,而用我的jdk1.3里面的javac可以编译通过,但是用java命令运行时就会抛出UnsatisfiedLinkError,就是说函数没有找到吧。 这个原因会不会是版本问题,请各位大虾继续指点。关键问题是我必须做到能够通过java来运行这个程序,而不是用jrew,谢谢支持!!! 关于Java中的String对象中的堆与栈的问题 Java 生产者 消费者 高分请教!无法显示中文名的图片. Java控件中的SetCursor函数对同一个控件不能使用两次吗 在线等十万火急,applet在本地打开可以使用,在服务器使用不了 问:静态变量消耗内存多还是静态类消耗内存多呢?? 如何将Object类型转化为Number类型 有关java编译的问题,急在线等待 超级大菜鸟的问题!给大分! 安装VisualAge3.5后运行不起来 url能传递参数吗?怎样才能传递参数(比如查询结果) 关于JBuilder5安装的问题,请救命!
本文档使用一个简单例子演示一下如何使用Java Native API。
程序的功能:用户输入直角三角形的两个直角边,程序输出斜边的长度。
步骤:
1:编写Java类:
类名:NativeTest.java
class NativeTest
{
public static void main(String [] args)
{
NativeTest aTest=new NativeTest();
int i0=Integer.valueOf(args[0]).intValue();
int i1=Integer.valueOf(args[1]).intValue();
double d=aTest.nativeHypotenuse(i0,i1);
System.out.println("the value for the Hypotenuse for a triangle of sides "+args[0]+" and "+args[1]+ " is "+d);
}
public native double nativeHypotenuse(int i,int j);
static
{
System.loadLibrary("NativeTest");
}
}
说明:
1、 在该Java类的main函数中,首先生成该类的一个实例,然后接受两个参数做为直角三角形的两个直角边,然后调用一个Native方法:nativeHypotenuse,计算直角三角形的斜边。该方法使用C语言实现。
2、 调用Native方法nativeHypotenuse的方式同调用Java类的其他方法完全相同。如:
double d=aTest.nativeHypotenuse(i0,i1);
3、 在Java的类文件中,首先要声明一个Native方法,方式如下:
public native double nativeHypotenuse(int i,int j);
在该方法中不包含任何代码(具体代码在C语言中实现,并且作为DLL提供),并且在方法的声明之后紧跟一个分号。
4、 为了确保Java虚拟机在首次使用该类的时候将DLL装载到内存,需要在包含这个Native方法的类中使用静态初始化程序块。本例中为:
static
{
System.loadLibrary("NativeTest");
}
其中NativeTest为DLL文件的名字
2:使用javah
在DOS窗口中运行:
javah –jni NativeTest
运行上述命令之后,在当前目录中生成一个C语言的头文件:
NativeTest.h。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeTest */#ifndef _Included_NativeTest
#define _Included_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NativeTest
* Method: nativeHypotenuse
* Signature: (II)D
*/
JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse
(JNIEnv *, jobject, jint, jint);#ifdef __cplusplus
}
#endif
#endif
在该文件中,javah程序会生成一个函数声明:JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse(JNIEnv *, jobject, jint, jint);
3:在当前目录中,创建一个文本文件:NativeTest.c,在该文件中,首先要引用全面由javah产生的头文件:
#include "NativeTest.h"
然后将上面的函数声明拷贝到该文件中。之后就可以根据自己的目的实现该函数。
在本例中,因为要使用C函数库中的方法,所以要包含头文件<math.h>。具体代码如下:
NativeTest.c
#include "NativeTest.h"
#include <math.h>
JNIEXPORT jdouble JNICALL Java_NativeTest_nativeHypotenuse(JNIEnv *env, jobject obj, jint i, jint j)
{
return sqrt(i*i + j*j);
}
3、编译动态连接库
1、 要想编译成动态连接库,首先要安装VC++和JDK。
2、 假设 JDK安装在系统的D:\jdk117\目录下。
3、 在DOS窗口中运行:
D:\Jdk117\demo\native\test>cl -Id:\jdk117\include -Id:\jdk117\include\win32 –LD NativeTest.c -FeNativeTest.dll
其中CL为VC++的编译程序。程序运行后,在当前目录中生成动态连接库NativeTest.dll
4、编译并运行
在DOS窗口中运行:
javac NativeTest.java
java NativeTest 3 4
可以得到输出结果:
the value for the Hypotenuse for a triangle of sides 3 and 4 is 5.0
就是说函数没有找到吧。 这个原因会不会是版本问题,请各位大虾继续指点。关键问题是我必须做到能够通过java来运行这个程序,而不是用jrew,谢谢支持!!!