http://topic.csdn.net/t/20020917/14/1030420.html
感謝大家支援,這幾天我在IBM中文及SUN官方網站中找了不少關於JNI的文章,受益非淺,希望
有相關問題的朋友,可到那找查相關資料.
1)在 Windows 中實現 Java 本地方法
http://www-900.ibm.com/developerWorks/cn/java/jnimthds/index.shtml
2)Java Native Interface: Programmer's Guide and Specification
http://java.sun.com/docs/books/jni
上面的文章對JNI介紹非常詳細,對JNI有性趣的朋友可以看看.
對於我提出的問題,我己有了成功例子,貼出來與大家分享.
有一myDll.dll庫,介面Trim(LPSTR lpString),功能是把lpString中的空格去掉。檔案原碼
如下:
#include <string.h>
#include <windows.h>
#ifdef _cplusplus
extern "C"{
#endif
__declspec(dllexport) void Trim(LPSTR lpString)
{
int iLength = strlen(lpString);
int iCount = 0;
char *lpChar = lpString;
int i;
for(i=0;i<iLength;i++)
{
if( *lpChar != ' ' )
{
lpString[ iCount ] = *lpChar;
iCount ++;
}
lpChar ++;
}
lpString[iCount ++] = 0;
}
#ifdef _cplusplus
}
#endif
(用VC6的cl編譯該檔案產生動態連結程式庫,cl -LD myDll.c -FemyDll.dll )
這裡假設我們不能得到該動態連結程式庫的原代碼,只有DLL及LIB檔案,在通過JNI用java調用時
,由於沒有DLL原代碼修改許可權,需要我們自己用C/C++再做一個中介庫DLL2,java調用這個
中介庫,該中介庫再調用原如的DLL庫,間接實現java本地方法的調用。
下面是我做的例子,環境:Win2000Server,JDK1.3,VC6.0
先編一個java程式,java2dll.java,代碼如下:
public class Java2dll
{
//聲明要用到的本地方法cTrim由中介庫(java2dll.dll)實現,它又調用了myDll.dll庫的T
rim(...)函數
private native String cTrim(String str);
static
{
System.loadLibrary( "java2dll" ); //載入本地方法(java2dll為動態
連結庫檔案名稱)
}
//自己定義的一個java方法,調用本地方法cTrim(),有點多餘,實際上你可直接訪
問本地方法cTrim()
public String javaTrim(String str)
{
return cTrim(str);
}
//示範結果
public static void main(String[] args)
{
Java2dll ss = new Java2dll();
String str1="I love You.";
String str2=ss.javaTrim(str1);
System.out.println("調用c DLL前:");
System.out.println("str1="+str1);
System.out.println("調用c DLL後:");
System.out.println("str2="+str2);
}
}
編譯該檔案,產生Java2dll.class檔案:
javac Java2dll.java
產生C的標頭檔Java2dll.h:
javah -jni Java2dll
用C編寫中介庫java2dll.c
#include <stdio.h>
#include "java2dll.h"
JNIEXPORT jstring JNICALL Java_Java2dll_cTrim
(JNIEnv *env, jobject obj, jstring str)
{
const char *strTemp;
strTemp=(*env)->GetStringUTFChars(env,str,NULL);
//錯誤出現時
if(strTemp==NULL)
{
return NULL;
}
//調用myDll.dll庫中的Trim()方法,去掉strTemp中的空格
Trim(strTemp);
return (*env)->NewStringUTF(env, strTemp);
(*env)->ReleaseStringUTFChars(env,str,strTemp);
}
說明:如果你用C++編寫,cpp檔案,上面代碼中的“(*env)”應改為“env”
編譯產生java2ddl.dll檔案。
用VC6的cl編譯。
cl -Id:\jdk13\include -Id:\jdk13\include\win32 -LD java2dll.c myDll.lib -Fejava2dll.dll
說明:-Id:\jdk13\include指明JNI需要的標頭檔.h位置,D:\JDK13為我的JDK安裝目錄
-LD 表明要產生動態連結程式庫
myDll.lib或 -link
myDll.lib表明要把myDll.dll連結上,否則中介庫java2dll找不到Trim(..)方法。
您可用cl /?得到HELP協助。
編譯成功後,可得到中介庫java2dll,運行一下,檢查結果。
java Java2dll
好了,你自己試一下吧。