1. 程式人生 > >Java JNI 呼叫C#方法

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#方法沒有什麼太大的必要。不過既然有法呼叫,那就學習一下了。