2010-09-28 5 views

risposta

4

Dal momento che ho lottato con questo (vedi il mio blog dal mio profilo, è il pitone, SWIG, eccezioni e registi, ma dovrebbe aiutare) mi permetta di darle un paio di pezzi di consulenza:

  1. don' t inviare eccezioni C++ fino allo stack Java. Craccerà la tua applicazione. Assicurati che siano tutti avvolti nel modo corretto. So che mi stai chiedendo di questo, ma è davvero fondamentale che tu lo faccia entrare
  2. Non provare a passare le eccezioni Java nello stack C++, esse vengono convertite in SWIGDirectorExceptions o SWIGMethodExceptions. È un vero dolore perché perdi informazioni sul tipo sull'eccezione Java. Invece, se non si ha a che fare con un regista, creare una classe C++ che non fa altro che generare eccezioni C++ in modo da poter propagare eccezioni C++ lungo lo stack C++.
  3. Avvolgere tutte le stringhe nude passate da Java a C++ in una stringa std :: string. Se li tieni come puntatori const char, Java avrà la possibilità di raccoglierli. Questo è vero per tutti gli articoli, ma è talmente trascurato che l'ho fatto e visto già alcune volte.

Successivamente, non leggere 1.1. Utilizzare la documentazione da 2.0 o 1.3. È molto più chiaro

+0

Apprezzo molto il feedback dettagliato. Sei apparentemente l'esperto mondiale su questo argomento, congratulazioni. –

+0

@Steve Townsend lol, no! Ho appena usato SWIG con Python e Java. Mi è anche capitato di scrivere le mie esperienze con gli altri in modo che potessero beneficiare/condividere il mio dolore. – wheaties

+0

Grazie per questo. – JamesC

7

Vedere anche nella documentazione di Swig 2.0 questo Java-specific section on exception handling.

Per evitare di scrivere il modello più di una volta, ho creato una macro SWIG sostenere metodi che gettano un tipo di C eccezione ++ - con la cattura che e gettando un'eccezione Java corrispondente:

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

Ecco la macro:

%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

Grazie per il puntatore Andy –

+0

Prego! So che la tua domanda ha qualche mese, ma volevo aggiungerla per i futuri lettori. –