http://topic.csdn.net/t/20020917/14/1030420.html
感謝大家支持,這幾天我在IBM中文及SUN官方網(wǎng)站中找了不少關(guān)于JNI的文章,受益非淺,希望
有相關(guān)問題的朋友,可到那找查相關(guān)資料.
1)在 Windows 中實(shí)現(xiàn) Java 本地方法
http://www-900.ibm.com/developerWorks/cn/java/jnimthds/index.shtml
2)Java Native Interface: Programmer's Guide and Specification
http://java./docs/books/jni
上面的文章對JNI介紹非常詳細(xì),對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編譯該文件生成動態(tài)鏈接庫,cl -LD myDll.c -FemyDll.dll )
這里假設(shè)我們不能得到該動態(tài)鏈接庫的原代碼,只有DLL及LIB文件,在通過JNI用java調(diào)用時
,由于沒有DLL原代碼修改權(quán)限,需要我們自己用C/C++再做一個中介庫DLL2,java調(diào)用這個
中介庫,該中介庫再調(diào)用原如的DLL庫,間接實(shí)現(xiàn)java本地方法的調(diào)用。
下面是我做的例子,環(huán)境:Win2000Server,JDK1.3,VC6.0
先編一個java程序,java2dll.java,代碼如下:
public class Java2dll
{
//聲明要用到的本地方法cTrim由中介庫(java2dll.dll)實(shí)現(xiàn),它又調(diào)用了myDll.dll庫的T
rim(...)函數(shù)
private native String cTrim(String str);
static
{
System.loadLibrary( "java2dll" ); //加載本地方法(java2dll為動態(tài)
鏈接庫文件名)
}
//自己定義的一個java方法,調(diào)用本地方法cTrim(),有點(diǎn)多余,實(shí)際上你可直接訪
問本地方法cTrim()
public String javaTrim(String str)
{
return cTrim(str);
}
//演示結(jié)果
public static void main(String[] args)
{
Java2dll ss = new Java2dll();
String str1="I love You.";
String str2=ss.javaTrim(str1);
System.out.println("調(diào)用c DLL前:");
System.out.println("str1="+str1);
System.out.println("調(diào)用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);
//錯誤出現(xiàn)時
if(strTemp==NULL)
{
return NULL;
}
//調(diào)用myDll.dll庫中的Trim()方法,去掉strTemp中的空格
Trim(strTemp);
return (*env)->NewStringUTF(env, strTemp);
(*env)->ReleaseStringUTFChars(env,str,strTemp);
}
說明:如果你用C++編寫,cpp文件,上面代碼中的“(*env)”應(yīng)改為“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 表明要生成動態(tài)鏈接庫
myDll.lib或 -link
myDll.lib表明要把myDll.dll鏈接上,否則中介庫java2dll找不到Trim(..)方法。
您可用cl /?得到HELP幫助。
編譯成功后,可得到中介庫java2dll,運(yùn)行一下,檢查結(jié)果。
java Java2dll
好了,你自己試一下吧。