首頁  >  文章  >  電腦教學  >  編寫供JAVA呼叫的DLL的VC實作方法

編寫供JAVA呼叫的DLL的VC實作方法

PHPz
PHPz轉載
2024-01-22 16:57:16928瀏覽

編寫供JAVA呼叫的DLL的VC實作方法

如何用VC寫一個供JAVA呼叫的DLL

}(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, s​​trlen(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中就可以呼叫了(要用到第二步產生的類別)! :)

怎麼為VC寫的EXE檔寫一個DLL檔讓這個EXE呼叫DLL

你是說要怎麼寫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中文網其他相關文章!

陳述:
本文轉載於:docexcel.net。如有侵權,請聯絡admin@php.cn刪除