2012-04-08 98 views
4

我試圖從Java程序中調用第三方.NET的DLL(從here兩者)​​第三方.NET的DLL。 尋找herehere後,我設法讓整個事情編譯和運行。但我運行.NET代碼時得到一個異常:調用使用JNI

由Java運行時環境

這隻有當我嘗試從內部訪問另一個.NET對象和方法發生已檢測

致命錯誤NET DLL:

JNIEXPORT void JNICALL Java_test_broadcast 
(JNIEnv *, jobject) 
{ 
    // Instantiate the MC++ class. 
    IManagedWrapper* t = IManagedWrapper::CreateInstance(); 

    // The actual call is made. 
    t->Broadcast(); 
} 

void ManagedWrapper::Broadcast(std::string message) 
{ 
    //Uncommenting the following line will raise the error 
    //IXDBroadcast^ broadcast = XDBroadcast::CreateBroadcast(XDTransportMode::WindowsMessaging); 
} 

我設法創建一個.NET DLL,鏈接到上面的代碼,並按需要工作。

如何我可以調用從Java代碼中的.NET對象和方法?

+1

Google向我展示了:[JNI4NET](http://jni4net.sourceforge.net/)和[在不使用regasm.exe的情況下從Java代碼調用.NET Dll](http:// codefry.blogspot.com/2012/01/calling-net-dlls-from-java-code-without.html)。如果您渴望並堅持不懈,它可能會向您展示更多解決方案。 – 2012-04-08 13:03:06

+0

謝謝!我在這裏發帖前找了2天,但我從未遇到您發佈的第二個鏈接。這就是訣竅! – Eldad 2012-04-08 14:23:36

+0

不客氣,祝你好運。 – 2012-04-08 14:25:41

回答

4

我finnaly跟着@「氣墊船全鰻魚」的評論鏈接: Calling .Net Dlls from Java code without using regasm.exe

我用C++ \ CLI本機之間的橋樑和託管代碼和它美麗的工作。 主要問題是我的網橋DLL在JVM下運行,並且我嘗試加載的DLL不在JRE \ bin目錄中。爲了克服這個問題,我裝了.NET程序集動態地從C++/CLI代碼(基於this):

static Assembly^ MyResolveEventHandler(Object^ sender, ResolveEventArgs^ args) 
{ 
    //Retrieve the list of referenced assemblies in an array of AssemblyName. 
    Assembly^ MyAssembly; 
    Assembly^ objExecutingAssemblies; 
    String^ strTempAssmbPath = ""; 

    objExecutingAssemblies = Assembly::GetExecutingAssembly(); 
    array<AssemblyName ^>^ arrReferencedAssmbNames = objExecutingAssemblies->GetReferencedAssemblies(); 

    //Loop through the array of referenced assembly names. 
    for each (AssemblyName^ strAssmbName in arrReferencedAssmbNames) 
    { 
     //Check for the assembly names that have raised the "AssemblyResolve" event. 
     if (strAssmbName->FullName->Substring(0, strAssmbName->FullName->IndexOf(",")) == args->Name->Substring(0, args->Name->IndexOf(","))) 
     { 
      //Build the path of the assembly from where it has to be loaded.     
      strTempAssmbPath = pathBase + args->Name->Substring(0, args->Name->IndexOf(",")) + ".dll"; 
      break; 
     } 

    } 
    //Load the assembly from the specified path.      
    MyAssembly = Assembly::LoadFrom(strTempAssmbPath); 

    //Return the loaded assembly. 
    return MyAssembly; 
} 
+0

我有相同的確切情況(通過JNI JVM到DLL,然後C++嘗試使用託管C#DLL並失敗),但我從來沒有從'AssemblyResolve'事件獲得回調。 – NateS 2015-08-17 10:13:05

1

這正是本地Java到.NET橋在後臺做。

根據的.NET代碼量,你需要使用你的.NET對象的複雜性(你有什麼樣的方法,如果使用仿製藥,如果你有陣列等),你也可以考慮使用這種橋。當你深入研究這種情況時,如果你自己通過C++/CLI手動執行,則會有更多限制出現。如果您需要爲生產環境中快速可靠的解決方案,我會建議檢查:

所有這些橋樑將覆蓋所有本地通信爲您和發貨速度也簡單的界面使用.NET加載任何DLL,甚至在您的JAVA應用程序中使用整個.NET Framework。

根據您的需求,Javonet我認爲是最簡單和很輕的一個巨大的力量和靈活性,如果你看具有良好的支持,易API可靠的商用解決方案,以獲得5分鐘完成的事情(爲definetly有用非商業和學術是免費的)。 JNBridge的更havy與強類型的代理類發生器也非常強大,也有利於商業用途,特別是如果你需要任何其專用的連接器(會影響價格,但要看你的需求)。 JNI4NET不錯的開源項目我會說非關鍵的,非商業的applience,但值得去檢查。

有了你不關心任何額外的執行這樣的橋,只需要複製.NET的DLL和JAVA使用它。你可以在這裏看到:http://www.youtube.com/watch?v=n6XfzrHTdK4