Puneet Nayyar had some problems with JNI and was kind enough to send me that DLL that didn't work with IKVM. It turned out that the DLL exported a bunch of methods without the name decorations that __stdcall (the JNICALL calling convention on Windows) requires. Originally I thought that the DLL used the __cdecl calling convention (which uses undecorated names, at least on the Visual Studio .NET 2003 C++ compiler, despite what Raymond Chen says), but an examination of the code showed that it did in fact pop the arguments of the stack. So the fix was trivial, just look up JNI methods in their undecorated form as well.
It worries me a little that this allows __cdecl methods to be found too (which is what you get when you forget the JNICALL modifier), because they would (most likely) result in a crash when called. The Sun JDK seems to (accidentally?) support the __cdecl calling convention, maybe they restore the stack pointer from EBP in their thunk.
- Merged with GNU Classpath cvs.
- Fixed Class.forName() bugs when dealing with invalid array class names.
- Fixed Array.newInstance() when used on an unfinished class.
- Changed os.name and os.version system properties to be more compatible with Sun (on Windows).
- Changed ikvmc to allow building empty assemblies (mainly useful for creating executable that start a main method in an already compiled assembly).
- Fixed FileChannelImpl to use a smaller buffer (FileStream forces the use of a buffer, but we don't want any buffering at all).
- Fixed FileChannelImpl.write(int) to flush and handle exceptions.
- Fixed FileChannelImpl to handle (asynchronously) closed streams correctly.
- Fixed some weak reference bugs.
- Fixed ikvmc to use correct resource names on Mono (leading slash wasn't chopped off).
- Fixed JNI method lookup to support unmangled names.
- Cleaned up handling of VerifyError and log the error in the right place.
- Changed compilation "exception" trace messages to Error category (from Warning).
- Added compiler support for special casing VMSystem.arraycopy (which is now called directly by Classpath's StringBuffer implementation).
New snapshots: just the binaries and source plus binaries.