S stepwin Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-28 #3 System.load("F://TrayIcon12.dll");
O only you Unregistered / Unconfirmed GUEST, unregistred user! 2003-07-28 #4 详细实现方法如下: 首先创建一个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 "C" { #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, &iscopy); int fd = open(mfile, O_RDONLY); if (fd == -1) { printf("Could not open %s/n", mfile); } lstat(mfile, &finfo); m = mmap((caddr_t) 0, finfo.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (m == (caddr_t)-1) { printf("Could not mmap %s/n", 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文件 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 "C" { #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, &iscopy); int fd = open(mfile, O_RDONLY); if (fd == -1) { printf("Could not open %s/n", mfile); } lstat(mfile, &finfo); m = mmap((caddr_t) 0, finfo.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (m == (caddr_t)-1) { printf("Could not mmap %s/n", 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 运行之!