Java JNI 呼叫C#方法
在編寫Java應用程式當中,可以利用C或者CPP來編寫DLL函式,然後再Java當中進行呼叫,從而實現對本地API的呼叫,這兩天因為業務需要,要利用Java呼叫C#函式。於是研究了一下,發現可以通過Manage C++來實現對C#函式的呼叫。具體方法如下:
首先還是編寫Java,利用javah生成CPP標頭檔案。然後跟普通JNI編寫過程一樣。然後在JNI的藉口函數出呼叫Manage C++方法。不過首先要編寫C#方法,然後生成netmodule檔案。選擇新建類庫,編寫好C#類和方法後,利用控制檯命令
csc /debug /t:module "yourcsfilename.cs" 生成netmodule檔案,在Manage C++當中,我們要利用此檔案來進行方法的呼叫。
然後編寫Manage C++檔案,這裡需要引用<mscorlib.dll>庫。如下:
#using <mscorlib.dll>
#using "yourfilename.netmodule"
using namespace System;
...
...
這裡貼上我的程式碼片斷:
#using <mscorlib.dll>
#using "ManageWindow.netmodule"
using namespace System;
public __gc class SetWindowC{
public:
CSSetWindow::ManageWindow __gc *mw;//關鍵字__gc garbage collection
SetWindowC(){
mw=new CSSetWindow::ManageWindow();
}
void callSetWindow(){ //行內函數呼叫C#的SetWindow方法。
mw->SetWindow();
}
};
然後在JNI的介面函式中呼叫Manage C++的方法就行了。
JNIEXPORT void JNICALL Java_com_efreda_sweet_jni_WindowControl_SetWindowOnTop(JNIEnv *env, jobject obj){
SetWindowC* sw=new SetWindowC();
sw->callSetWindow();
}
需要注意的是在編譯時可能會出現一個/clr的錯誤。
如果出現,將專案屬性,常規,公共語言執行庫支援選擇為/clr:oldSyntax,注意一定要是oldSyntax。否則編譯不過(因為用到了__gc關鍵字)。
個人感覺用Java的JNI來呼叫C#方法沒有什麼太大的必要。不過既然有法呼叫,那就學習一下了。