2010-09-28 144 views

回答

4

自從我這個糾結(見我的個人資料我的博客,這是對蟒蛇,SWIG,例外和董事,但應該幫助)讓我給你的建議幾塊:

  1. 別不會將C++異常發送到Java堆棧。它會使您的應用程序崩潰。確保它們都以正確的方式包裹。我知道你在問這個問題,但你真的需要這樣做。一個錯過的例外可以解決所有問題。
  2. 不要試圖通過Java異常下降到C++棧,他們得到轉換爲SWIGDirectorExceptions或SWIGMethodExceptions。這是一個真正的痛苦,因爲你在Java異常上丟失了類型信息。相反,如果你沒有和導演打交道,那麼創建一個C++類,除了引發C++異常外,你還可以在C++棧中傳播C++異常。
  3. 將從Java傳遞到C++的所有裸體字符串包裝在std :: string中。如果你將它們保留爲const char指針,Java可以選擇垃圾收集它們。所有項目都是如此,但這是一個容易被忽視的項目,我已經完成了它,並且已經完成了幾次。

之後,不讀1.1。使用2.0或1.3的文檔。這更清楚。

+0

我真的很感激的具體反饋。恭喜你,你顯然是這個話題的全球專家。 – 2010-11-09 15:18:52

+0

@Steve Townsend哈哈,不!我剛剛使用了Python和Java的SWIG。我也碰巧寫下了我與他人的經歷,以便他們能夠受益/分享我的痛苦。 – wheaties 2010-11-09 16:01:40

+0

謝謝你。 – JamesC 2011-12-06 16:36:53

7

又見痛飲2.0文檔此Java-specific section on exception handling英寸

避免編寫模式不止一次,我創建了一大口宏支持拋出一個類型C++異常的方法 - 通過抓住這一點,拋出一個相應的Java異常:

WRAP_THROW_EXCEPTION(myCppDeclaration, com::foo::MyCppExceptionClass, 
    "com.foo.MyException", 
    "com/foo/MyException"); 

這裏的宏:

%define WRAP_THROW_EXCEPTION(MATCH, CPPTYPE, JTYPE, JNITYPE) 
%javaexception(JTYPE) MATCH { 
    try { 
    $action 
    } 
    catch (CPPTYPE & e) { 
    jclass eclass = jenv->FindClass(JNITYPE); 
    if (eclass) { 
     jenv->ThrowNew(eclass, e.what()); 
    } 
    } 
} 
%enddef 
+0

感謝您的指點Andy – 2010-11-11 18:45:18

+0

不客氣!我知道你的問題已經過去了幾個月,但我想爲未來的讀者添加這個問題。 – 2010-11-11 22:05:36