Skip to content


Subversion checkout URL

You can clone with
Download ZIP
IKVM hacked to work with MonoTouch
Java C# Other
Failed to load latest commit information.
awt Auto-generated files.
bin-x64 Initial version of IKVM source.
bin-x86 Initial version of IKVM source.
classpath Added temporary Begin/EndAsync impls to work around mcs bug.
ikvm Initial version of IKVM source.
ikvmc This hack is needed to get things working with 3.x.
ikvmdoc Initial version of IKVM source.
ikvmstub Initial version of IKVM source.
japi Initial version of IKVM source.
jvm Initial version of IKVM source.
native removed arm6 natives build, initial test to fix JIT invocation on device
openjdk Updated to work with Xamarin 6.4 / Mono 3.x.
reflect Disable use of [ComImport] which seems not to work in latest MonoTouch.
runtime Better reflection-avoidance approach (from Jeroen).
tools Auto-generated files.
.dir-locals.el Some metadata.
.gitignore fixed gitignore Initial version of IKVM source.
HOWTO Initial version of IKVM source.
ICSharpCode.SharpZipLib.dll move zlib assembly out of bin
LICENSE Initial version of IKVM source.
NAnt.exe.config.patch Added NAnt.exe.config patch, updated README. Added NAnt.exe.config patch, updated README.
THANKYOU Initial version of IKVM source.
THIRD_PARTY_README Initial version of IKVM source.
TRADEMARK Initial version of IKVM source. Updated to work with Xamarin 6.4 / Mono 3.x. A script for cleaning build artifacts. Updated to work with Xamarin 6.4 / Mono 3.x.
ikvm.include Updated to work with Xamarin 6.4 / Mono 3.x.
ikvm9.sln Initial version of IKVM source.
ikvmc.8.csproj Initial version of IKVM source.

IKVM MonoTouch

This code is based on release of IKVM and is modified to allow operation with MonoTouch. The two big challenges in supporting MonoTouch are:

  • MonoTouch uses AOT compilation to deploy to iOS, and thus cannot support dynamic code generation. IKVM uses dynamic code generation extensively to support fast reflection.

  • MonoTouch only provides the Silverlight runtime profile, which lacks a substantial number of the features of the desktop profile, on which IKVM relies.

These challenges have largely been overcome:

  • Reflection is supported through standard CLR reflection (which is slower than code generation, but at least it works).

  • The Silverlight profile is accommodated by aggressive pruning of the JDK with which IKVM operates. This means that the vast majority of the "enterprisey" features of OpenJDK are not available via IKVM MonoTouch.


IKVM MonoTouch can (naturally) only be built on a Mac which has MonoTouch installed. You also need to install NAnt (as it's no longer bundled with MonoTouch). Once you've installed NAnt, you need to patch your bin/NAnt.exe.config file using the NAnt.exe.config.patch in the top-level directory of ikvm-monotouch.

In addition to this project, you need to check out the ikvm-openjdk repository in the same directory that contains the ikvm-monotouch checkout. The IKVM build will use the Java source in the ikvm-openjdk directory during its build.

Once you have created your symlink and checked out ikvm-openjdk, you can build everything using the script:


This will generate all of the IKVM dlls and exes in the ikvm-monotouch/bin directory. This version of IKVM can then be used in the normal manner to convert Java bytecode to a dll that can be included in a MonoTouch project.

JNI is supported by including the bin/libikvm-natives.a file in your MonoTouch project. The file needs to be copied, not linked, otherwise MonoTouch does not pick it up. You have to add the following arguments to IPhone Build -> Additional mtouch arguments:

-nosymbolstrip -nostrip -cxx -gcc_flags "-L${ProjectDir} -likvm-natives -force_load ${ProjectDir}/libikvm-natives.a"

Your JNI code must use the jni.h file found in native/. Setup an XCode static library project, add your JNI files plus a reference to native/jni.h. Then add the static library just like you add the libikvm-native.a file (including the mtouch arguments to force link all symbols).

It is not necessary to use this custom project to convert C# dlls to Java stub classes (via ikvmstub.exe), but you can use it, and save yourself the trouble of installing a standard IKVM distribution.


There are numerous limitations, too many to enumerate. However, this project is successfully enabling the PlayN game development library to convert Java game projects into iOS binaries.

One known limitation that can probably be overcome is the lack of support. The aggressive pruning of the OpenJDK to remove all of the enterprise functionality that could not be supported on Silverlight resulted in being cut out due non-trivial internal dependencies on JNDI and from there into a bunch of enterprise crap.

I strongly suspect that the JNDI and other enterprise crap can be surgically removed, leaving a functional which supports basic DNS and TCP/UDP. However, that will take more time and effort than I have thus far been able to muster.


See LICENSE for license information on IKVM.


Questions, comments, and suchlike can be directed to the Three Rings Libraries Google Group.

Something went wrong with that request. Please try again.