}(2)編譯該java文件,再編譯生成頭文件(供vc使用)javac GB2PY.java //編譯生成class(3)在目前資料夾下建立com/bw/gb2py 資料夾,將GB2PY .class放入此資料夾,回到目前資料夾,呼叫javah指令產生頭檔。 javah com.bw.gb2py.GB2PY //產生頭文件,檔案名稱為com_bw_gb2py_GB2PY.h注意頭檔中的內容不能更改,否則產生的dll不能使用(4)在VC中新建名為GB2PY的Win32 dll工程,將com_bw_gb2py_GB2PY.h拷貝到工程目錄下,並加入工程。再拷貝%JAVA_HOME%/include/jni.h 和 %JAVA_HOME%/include/win32/jni_md.h 到工程目錄下,並加入工程。 (5)實作com_bw_gb2py_GB2PY.h中宣告的方法:Java_com_bw_gb2py_GB2PY_GetPY。注意java string和c中char的轉換。 java的string都用unicode編碼(雙位元組),而char是單字節的。 int (*GetPY)(char* szGBString,PY &oPY);JNIEXPORT jstring JNICALL Java_com_bw_gb2py_GB2PY_GetPY
(JNIEnv * env, jclass, jstring name){static HMODULE hModle = LoadLibrary("PYconvert.dll"); //第三方dll
GetPY = (LPFUN)GetProcAddress(hModle,"GBToPY");int len;char charName[128];
char charPY[512];
len = env->GetStringLength(name) * 2 1; //雙位元組長度轉為單字節長度,加1是為了加結束符號
memset(charName, 0, len);
const wchar_t * w_buffer = env->GetStringChars(name, 0);
int wlen = wcslen(w_buffer);
len = WideCharToMultiByte(CP_ACP, 0, w_buffer, wcslen(w_buffer) 1, charName, len, NULL, NULL);
env->ReleaseStringChars(name, w_buffer);//以上程式碼將java string name中的內容拷貝到了char數組charName中... //省略部分功能代碼,透過呼叫第三方的dll函數將漢字轉換為拼音,儲存在charPY陣列中int slen = strlen(charPY);
jchar * buffer = new jchar[slen];
len = MultiByteToWideChar(CP_ACP, 0, charPY, strlen(charPY), buffer, slen);
if (len > 0 & len
buffer[len] = 0;//以上程式碼將char型字串轉換為jchar型字串 jstring js = env->NewString(buffer, len);
delete [] buffer;return js;}(6)編譯產生dll文件,在java中就可以呼叫了(要用到第二步產生的類別)! :)
你是說要怎麼寫dll? ,還是怎麼呼叫你寫的dll?
怎麼寫dll:vc 6.0的話,在建立新工程時常用的選擇以下任一個:
MFC AppWizard[dll] 可以使用MFC框架的動態連線庫
Win32 Dynamic-link Library window32位元標準動態函式庫
然後選擇你需要的框架,然後完成,基本的dll就這樣好了。
vs2003以上版本(vs2010沒用過,不提)的話,創建新
工程常用的有以下兩種:
MFC->MFC Dll
Win32->任一->在彈出的對話框中選擇Dll選項
其它選項看自己的需。然後完成,基本的dll就這樣好了。
呼叫你寫的dll:在需要呼叫的地方使用LoadLibrary("xxx.dll");
xxx.dll是你寫的dll,然後如果你在xxx.dll中寫了
介面的話,可以用以下方法呼叫dll中的方法:
1、在你的exe工程中包含dll的介面頭文件,例如介面函數為void FunName(int a);
2、typedef void(*Func)(int);//定義介面
3、在需要呼叫的地方使用:
.......................
HMOUDLE hMyDll = LoadLibrary("xxx.dll");
if (hMyDll != NULL)
{
Func *pDllFun=(Func *)::GetProcAddress(hMyDll,"FunName");//FunName就是你Dll中的介面函式
if (pDllFun != NULL)
{
pDllFun(1);//呼叫Dll中函數
}
}
4、在不需要Dll的時候,卸載Dll。 FreeLibrary(hMyDll);
/////////////////////////////////////////////// ///////
你的Dll有沒有產生到exe所在的目錄下?
以上是編寫供JAVA呼叫的DLL的VC實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!