A couple of fixes and a clean up of the JNI code. The Managed C++ JNI provider used some clever tricks and when I ported them to C# they turned into ugly hacks, so I removed them. More on that in a future entry.
Changes:
- Changed VMAccessController and VMClassLoader to use .NET thread local storage instead of a Java ThreadLocal to reduce initialization order dependencies.
- Added -XXsave flag to ikvm.exe to save debug image of single threaded apps that don't call System.exit().
- Added -apartment:[sta|mta|none] flag to ikvmc (default is to apply the STAThreadAttribute to main).
- Added Win64 support to ikvm-native.
- Fixed class file parser to properly resize the instruction array. Previously, the compiler got confused when emitting debugging information.
- Added code to save the assembly used for non-virtual reflective method invocations when -Xsave is used.
- Introduced JNI type name aliases in JniInterface to make the code more readable.
- Implemented JNI functions: EnsureLocalCapacity, PushLocalFrame, PopLocalFrame, NewWeakGlobalRef and DeleteWeakGlobalRef.
- Fixed Debug.Assert in GhostMethodWrapper (MemberWrapper.cs).
- Fixed JniProxyBuilder to emit ldtoken and pass it as an argument to the real JNI method.
- Improved error handling in gnu.java.io.EncodingManager.
- Fixed support for setting the java.library.path property on the ikvm.exe command line.
- Fixed default java.library.path on Windows.
- Added workaround for Mono 1.0 bug in Marshal.AllocHGlobal.
- Fixed delegate reflection bug that caused ikvmstub not to emit the nested Method interface for delegates.
- Added resource name mangling to make ILDASM/ILASM roundtripping work.
New snapshots: just the binaries and source plus binaries.