2011-08-29 252 views
6

我對處理異常被庫下JNA拋出一個快速的問題...JNA捕獲異常

當我扔在底層的本機代碼的異常,JNA得到一個無效的內存訪問錯誤。我假設這是因爲C庫不能通過它的堆棧拋出異常(它實際上是C++/CLR但具有C導出)?那麼是否沒有真正的方法來向Java報告異常?或者「它應該工作」,我只是在做一些令人難以置信的錯誤?

DllExport void Initialize(char* dir) 
{ 
    throw gcnew System::Exception("Testing"); 
} 

這將是很好的Java能夠檢測這些拋出的異常,我想我其實可以考慮通過內存指針到所有我的C出口和檢查,看看是否這些都是空或不是,但似乎是一個迂迴的方式。

回答

4

您需要自己處理C++異常,而是構建一個可以傳遞給代碼的Java端的java異常。

+0

因此,我會在C++/CLR端捕獲它,並將它作爲多個參數傳回給java? (或者在想要簡單的錯誤報告的情況下,只需要第二個參數,「char * err」就足夠了)。我想我可能必須這樣做。 – StrangeWill

4

C++異常只能在C++代碼中處理。他們絕不應該被允許逃離C++世界(即,C++代碼的C接口絕對不應該讓異常傳播)。讓C++異常通過兩個C++模塊之間的一層C代碼傳播是不安全的(例如,當一個C++函數調用一個C函數,該函數又調用一個C++函數時)。

其中一個原因是沒有關於如何實現C++異常的標準,因此如果由相同編譯器編譯(在相同版本中),C++模塊只是二進制兼容的。因此,不能設置任何其他語言的代碼來處理C++異常。在這種情況下(C++庫,C接口,從Java調用),您必須捕獲C++異常,通過C接口傳播信息(例如,通過使用錯誤返回碼),在Java中檢查它並在那裏拋出異常。