http://topic.csdn.net/t/20020917/14/1030420.html
感謝大家支持,這幾天我在IBM中文及SUN官方網(wǎng)站中找了不少關(guān)于JNI的文章,受益非淺,希望
有相關(guān)問(wè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
上面的文章對(duì)JNI介紹非常詳細(xì),對(duì)JNI有性趣的朋友可以看看.
對(duì)于我提出的問(wèn)題,我己有了成功例子,貼出來(lái)與大家分享.
有一myDll.dll庫(kù),接口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編譯該文件生成動(dòng)態(tài)鏈接庫(kù),cl -LD myDll.c -FemyDll.dll )
這里假設(shè)我們不能得到該動(dòng)態(tài)鏈接庫(kù)的原代碼,只有DLL及LIB文件,在通過(guò)JNI用java調(diào)用時(shí)
,由于沒(méi)有DLL原代碼修改權(quán)限,需要我們自己用C/C++再做一個(gè)中介庫(kù)DLL2,java調(diào)用這個(gè)
中介庫(kù),該中介庫(kù)再調(diào)用原如的DLL庫(kù),間接實(shí)現(xiàn)java本地方法的調(diào)用。
下面是我做的例子,環(huán)境:Win2000Server,JDK1.3,VC6.0
先編一個(gè)java程序,java2dll.java,代碼如下:
public class Java2dll
{
//聲明要用到的本地方法cTrim由中介庫(kù)(java2dll.dll)實(shí)現(xiàn),它又調(diào)用了myDll.dll庫(kù)的T
rim(...)函數(shù)
private native String cTrim(String str);
static
{
System.loadLibrary( "java2dll" ); //加載本地方法(java2dll為動(dòng)態(tài)
鏈接庫(kù)文件名)
}
//自己定義的一個(gè)java方法,調(diào)用本地方法cTrim(),有點(diǎn)多余,實(shí)際上你可直接訪
問(wèn)本地方法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編寫(xiě)中介庫(kù)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);
//錯(cuò)誤出現(xiàn)時(shí)
if(strTemp==NULL)
{
return NULL;
}
//調(diào)用myDll.dll庫(kù)中的Trim()方法,去掉strTemp中的空格
Trim(strTemp);
return (*env)->NewStringUTF(env, strTemp);
(*env)->ReleaseStringUTFChars(env,str,strTemp);
}
說(shuō)明:如果你用C++編寫(xiě),cpp文件,上面代碼中的“(*env)”應(yīng)改為“env”
編譯生成java2ddl.dll文件。
用VC6的cl編譯。
cl -Id:\jdk13\include -Id:\jdk13\include\win32 -LD java2dll.c myDll.lib -Fejava2dll.dll
說(shuō)明:-Id:\jdk13\include指明JNI需要的頭文件.h位置,D:\JDK13為我的JDK安裝目錄
-LD 表明要生成動(dòng)態(tài)鏈接庫(kù)
myDll.lib或 -link
myDll.lib表明要把myDll.dll鏈接上,否則中介庫(kù)java2dll找不到Trim(..)方法。
您可用cl /?得到HELP幫助。
編譯成功后,可得到中介庫(kù)java2dll,運(yùn)行一下,檢查結(jié)果。
java Java2dll
好了,你自己試一下吧。