JAVA如何调用其他语言编写的DLL? ( 积分: 100 )

  • 主题发起人 主题发起人 明月几时有
  • 开始时间 开始时间

明月几时有

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在使用DELPHI编写了一个DLL文件,还有一个COM组件,如果JAVA想调用DLL或者COM组件当中的函数,应该怎么样去做?
我现在知道的方法是用JNI去做,但是相对来说觉得比较麻烦,还有没有更简单一点的方法。
最好能有实际点的例子,我对JAVA语言不是很熟悉,谢谢!!
 
我现在使用DELPHI编写了一个DLL文件,还有一个COM组件,如果JAVA想调用DLL或者COM组件当中的函数,应该怎么样去做?
我现在知道的方法是用JNI去做,但是相对来说觉得比较麻烦,还有没有更简单一点的方法。
最好能有实际点的例子,我对JAVA语言不是很熟悉,谢谢!!
 
详细实现方法如下:
首先创建一个java文件
import java.util.*;
class ReadFile {
//定义要本地化的方法
native byte[] loadFile(String name);
//调用dll,注意此处必须要用static修饰
static {
System.loadLibrary("nativelib");
}
public static void main(String args[]) {
byte buf[];
ReadFile mappedFile=new ReadFile();
buf=mappedFile.loadFile("ReadFile.java");
for(int i=0;i<buf.length;i++) {
System.out.print((char)buf);
}
}
}
在命令行下用 javac ReadFile.java
编译出类文件 ReadFile.class
然后用javah -jni ReadFile 产生出头文件ReadFile.h,文件内容如下
/*do
NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ReadFile */
#ifndef _Included_ReadFile
#define _Included_ReadFile
#ifdef __cplusplus
extern &quot;C&quot;
{
#endif
/*
* Class: ReadFile
* Method: loadFile
* Signature: (Ljava/lang/String;)[B
*/
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
然后使用C或者C++编辑器编辑实现该方法的文件
#include <jni.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv * env, jobject jobj, jstring name) {
caddr_t m;
jbyteArray jb;
jboolean iscopy;
struct stat finfo;
const char *mfile = (*env)->GetStringUTFChars(
env, name, &amp;iscopy);
int fd = open(mfile, O_RDONLY);
if (fd == -1) {
printf(&quot;Could not open %s/n&quot;, mfile);
}
lstat(mfile, &amp;finfo);
m = mmap((caddr_t) 0, finfo.st_size,
PROT_READ, MAP_PRIVATE, fd, 0);
if (m == (caddr_t)-1) {
printf(&quot;Could not mmap %s/n&quot;, mfile);
return(0);
}
jb=(*env)->NewByteArray(env, finfo.st_size);
(*env)->SetByteArrayRegion(env, jb, 0,
finfo.st_size, (jbyte *)m);
close(fd);
(*env)->ReleaseStringUTFChars(env, name, mfile);
return (jb);
}
在Win32/WinNT/Win2000平台下使用带如下参数的命令行进行编译
cl -Ic:/jdk1.2/include
-Ic:/jdk1.2/include/win32
-LD nativelib.c -Felibnative.dll
然后在运行之前,必须让虚拟机可以找到该动态连接库的路径,可以直接在系统变量里设置
或者 set PATH=%path%;.
最后用 java ReadFile 运行之!
 
我的java也不熟
 
java com bridge 好像有这类东西
 
后退
顶部