> On Nov 28, 2017, at 16:09, William Schilp <william.sch...@ansys.com> wrote: > > i sort of agree with you. throwing an object through a DLL boundary may be > problematic due to memory allocation/deallocation. but in this case, it's > throwing a pointer (_jthrowable*), which is pretty much the same as > throwing an int...
Until you free the pointer or something... But you didn’t answer my question ? Andi.. > > >> On Tue, Nov 28, 2017 at 12:42 PM, Andi Vajda <va...@apache.org> wrote: >> >> >>> On Nov 28, 2017, at 11:27, William Schilp <william.sch...@ansys.com> >> wrote: >>> >>> i'm using JCC in a rather large project where a C++ interface drives a >> java >>> application through the JCC interface. the java application makes >>> considerable use of exceptions (as it should) and the C++ interface needs >>> to catch the various exceptions and perform various actions based on the >>> exception thrown. unfortunately i have to use visual studio to compile >> the >>> C++ interface as well as the JCC interface. with vs2012 i was getting >>> random problems when trying to extract information from an exception >> thrown >>> by the java application as ExceptionOccurred() would randomly return >> NULL.. >>> with vs2015, ExceptionOccurred() always returns NULL. the basic flow was >>> this: >>> >>> // setup the JNI interface, which returns a pointer to the JNIenv >>> JNIEnv* jniEnv = setupJNIenv(); >>> >>> _jthrowable* jException = NULL; >>> try >>> { >>> <call something via JCC which fails throwing an exception in the java >>> code>; >>> } >>> catch(_EXC_JAVA jErr); >>> { >>> _jthrowable* jException = jniEnv->ExceptionOccurred(); <--- in vs2012 >>> this randomly returns NULL for exceptions that are caught >>> } >>> if(jException != NULL) >>> { >>> <do something for exception> >>> >>> as noted, ExceptionOccurred() would randomly return NULL when built with >>> vs2012, this was annoying but only happened on windows 10 machines. we've >>> moved to vs2015, and now ExceptionOccurred() always returns NULL. in >>> debugging this issue i put a break in JCCEnv::reportException(): >>> >>> void JCCEnv::reportException() const >>> { >>> JNIEnv *vm_env = get_vm_env(); >>> jthrowable throwable = vm_env->ExceptionOccurred(); <---- throwable is >>> not NULL here... >>> >>> if (throwable) >>> { >>> if (!env->handlers) >>> vm_env->ExceptionDescribe(); >>> >>> // python code removed >>> } >>> throw _EXC_JAVA; >>> } >>> >>> when i break at vm_env->ExceptionOccurred() it returns a non-NULL >>> throwable. then when i break in my catch block: catch(_EXC_JAVA)... >>> and look at the return value for ExceptionOccurred() it returns NULL. for >>> whatever reason, between the break in reportException() at >>> ExceptionOccurred() and my catch block, whatever is supposed to store the >>> jthrowable pointer gets set to NULL. >>> so i made a change to the throw _EXC_JAVA to throw a copy of the >> jthrowable >>> as such: >>> >>> throw jthrowable; >>> >>> and then catch the jthrowable in my interface. this appears to work as >> the >>> jthrowable is now non-NULL and i'm able to extract the actual contents of >>> the exception. >>> >>> my questions: >>> >>> 1. Why does JCCEnv::reportException() throw an int instead of the >>> jthrowable? >> >> Because throwing object exceptions across DLL boundaries is fraught. Using >> int is recommended. >> >>> 2. do you have any idea why the return of JCCEnv::ExceptionOccurred() >> would >>> return non-NULL in reportException() and then in a later catch block >> return >>> NULL? >> >> If I remember correctly, the exception support requires JCC to be built in >> shared mode. >> Did you build it this way ? >> >> Andi.. >> >> >>