From: Pete F. <pet...@gm...> - 2008-03-27 15:04:58
|
Hi, I'm trying to wrap a C API and call it from Java. The C API typically returns a negative value on error. Some of the API functions take arrays as in/out parameters, so I'm using arrays_java.i to generate the code for that. I noticed that in the case where the internal JavaArrayInUshort fails for some reason, the return $null in arrays_java.i changes to return 0 in the code. However, this is a successful return from the function so the calling code doesn't think there is any error. I see some of the cases in the JavaArrayInUshort will throw an exception, but in other cases, the function will just return 0. So, is there a way, short of hacking up swig, to control how $null is mapped to a return code. It would see that this would be a variable I could set in the swig interface file, but I couldn't find anything for it, and in briefly glancing at the code in Modules/java.cxx, it looks like it's hard coded to just return 0. Thanks for any help. Pete |
From: William S F. <ws...@fu...> - 2008-03-27 21:18:36
|
Pete Flugstad wrote: > Hi, > > I'm trying to wrap a C API and call it from Java. The C API typically > returns a negative value on error. Some of the API functions take > arrays as in/out parameters, so I'm using arrays_java.i to generate > the code for that. > > I noticed that in the case where the internal JavaArrayInUshort fails > for some reason, the return $null in arrays_java.i changes to return 0 > in the code. However, this is a successful return from the function so > the calling code doesn't think there is any error. > > I see some of the cases in the JavaArrayInUshort will throw an exception, > but in other cases, the function will just return 0. > > So, is there a way, short of hacking up swig, to control how $null is > mapped to a return code. It would see that this would be a variable > I could set in the swig interface file, but I couldn't find anything for it, > and in briefly glancing at the code in Modules/java.cxx, it looks like it's > hard coded to just return 0. > > For void methods $null is replaced with empty space. For anything else it is hard coded to 0. You'll find that the SWIG libraries return $null if and only if an exception is pending. When the code exits the JNI layer, the JVM will then throw the pending exception. Your C like API will never receive these 0 values as the exception will be thrown before your Java code can check for the return value. If you think $null is returned when there is no pending exception, it is a bug and I'd ask you to send a small test case showing the problem. William |