From b65898e0dd73615af12027ee41a8795c77659720 Mon Sep 17 00:00:00 2001
From: str4d <str4d@mail.i2p>
Date: Wed, 3 Apr 2013 01:39:33 +0000
Subject: [PATCH] Ticket #741 - Added limewireExe source

---
 installer/c/limewireExe/LimeWire3.sln    |   22 +
 installer/c/limewireExe/LimeWire3.suo    |  Bin 0 -> 27648 bytes
 installer/c/limewireExe/LimeWire3.vcproj |  331 ++++
 installer/c/limewireExe/LimeWire31.rc    |  113 ++
 installer/c/limewireExe/errors.h         |   11 +
 installer/c/limewireExe/java.c           | 1042 ++++++++++++
 installer/c/limewireExe/java.h           |   76 +
 installer/c/limewireExe/java_md.c        |  388 +++++
 installer/c/limewireExe/java_md.h        |   28 +
 installer/c/limewireExe/jni.h            | 1944 ++++++++++++++++++++++
 installer/c/limewireExe/jni_md.h         |   19 +
 installer/c/limewireExe/limewire.c       |  234 +++
 installer/c/limewireExe/merged icon.ico  |  Bin 0 -> 97294 bytes
 installer/c/limewireExe/resource1.h      |   17 +
 installer/c/limewireExe/torrent.ico      |  Bin 0 -> 25214 bytes
 15 files changed, 4225 insertions(+)
 create mode 100644 installer/c/limewireExe/LimeWire3.sln
 create mode 100644 installer/c/limewireExe/LimeWire3.suo
 create mode 100644 installer/c/limewireExe/LimeWire3.vcproj
 create mode 100644 installer/c/limewireExe/LimeWire31.rc
 create mode 100644 installer/c/limewireExe/errors.h
 create mode 100644 installer/c/limewireExe/java.c
 create mode 100644 installer/c/limewireExe/java.h
 create mode 100644 installer/c/limewireExe/java_md.c
 create mode 100644 installer/c/limewireExe/java_md.h
 create mode 100644 installer/c/limewireExe/jni.h
 create mode 100644 installer/c/limewireExe/jni_md.h
 create mode 100644 installer/c/limewireExe/limewire.c
 create mode 100644 installer/c/limewireExe/merged icon.ico
 create mode 100644 installer/c/limewireExe/resource1.h
 create mode 100644 installer/c/limewireExe/torrent.ico

diff --git a/installer/c/limewireExe/LimeWire3.sln b/installer/c/limewireExe/LimeWire3.sln
new file mode 100644
index 0000000000..789dc66e4f
--- /dev/null
+++ b/installer/c/limewireExe/LimeWire3.sln
@@ -0,0 +1,22 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LimeWire3", "LimeWire3.vcproj", "{0A74F3D1-C70A-4CF0-9390-C676025ED12F}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+		Release-alpha|Win32 = Release-alpha|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0A74F3D1-C70A-4CF0-9390-C676025ED12F}.Debug|Win32.ActiveCfg = Debug|Win32
+		{0A74F3D1-C70A-4CF0-9390-C676025ED12F}.Debug|Win32.Build.0 = Debug|Win32
+		{0A74F3D1-C70A-4CF0-9390-C676025ED12F}.Release|Win32.ActiveCfg = Release|Win32
+		{0A74F3D1-C70A-4CF0-9390-C676025ED12F}.Release|Win32.Build.0 = Release|Win32
+		{0A74F3D1-C70A-4CF0-9390-C676025ED12F}.Release-alpha|Win32.ActiveCfg = Release-alpha|Win32
+		{0A74F3D1-C70A-4CF0-9390-C676025ED12F}.Release-alpha|Win32.Build.0 = Release-alpha|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/installer/c/limewireExe/LimeWire3.suo b/installer/c/limewireExe/LimeWire3.suo
new file mode 100644
index 0000000000000000000000000000000000000000..0cdc68d24bac7fb30382adb642e7b21b926ab5c3
GIT binary patch
literal 27648
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

literal 0
HcmV?d00001

diff --git a/installer/c/limewireExe/LimeWire3.vcproj b/installer/c/limewireExe/LimeWire3.vcproj
new file mode 100644
index 0000000000..e66c9e10ce
--- /dev/null
+++ b/installer/c/limewireExe/LimeWire3.vcproj
@@ -0,0 +1,331 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="LimeWire3"
+	ProjectGUID="{0A74F3D1-C70A-4CF0-9390-C676025ED12F}"
+	RootNamespace="LimeWire3"
+	Keyword="Win32Proj"
+	TargetFrameworkVersion="131072"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="Debug"
+			IntermediateDirectory="Debug"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="&quot;C:\Program Files\Java\jdk1.6.0\include\win32&quot;;&quot;C:\Program Files\Java\jdk1.6.0\include&quot;"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="4"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="Shlwapi.lib"
+				OutputFile="$(OutDir)/LimeWire.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(OutDir)/LimeWire3.pdb"
+				SubSystem="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="LimeWire.exe.manifest"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="Release"
+			IntermediateDirectory="Release"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="0"
+				AdditionalIncludeDirectories="&quot;C:\Program Files\Java\jdk1.6.0_13\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0_13\include\win32&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="shlwapi.lib"
+				OutputFile="$(OutDir)/MuWire.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release-alpha|Win32"
+			OutputDirectory="$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/D&quot;ALPHA&quot;"
+				Optimization="2"
+				InlineFunctionExpansion="0"
+				AdditionalIncludeDirectories="&quot;C:\Program Files\Java\jdk1.6.0\include&quot;;&quot;C:\Program Files\Java\jdk1.6.0\include\win32&quot;"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="shlwapi.lib"
+				OutputFile="$(OutDir)/LimeWire.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath=".\java.c"
+				>
+			</File>
+			<File
+				RelativePath=".\java_md.c"
+				>
+			</File>
+			<File
+				RelativePath=".\limewire.c"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath=".\errors.h"
+				>
+			</File>
+			<File
+				RelativePath=".\java.h"
+				>
+			</File>
+			<File
+				RelativePath=".\java_md.h"
+				>
+			</File>
+			<File
+				RelativePath=".\jni.h"
+				>
+			</File>
+			<File
+				RelativePath=".\jni_md.h"
+				>
+			</File>
+			<File
+				RelativePath=".\resource1.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath=".\LimeWire31.rc"
+				>
+			</File>
+			<File
+				RelativePath=".\merged icon.ico"
+				>
+			</File>
+			<File
+				RelativePath=".\torrent.ico"
+				>
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/installer/c/limewireExe/LimeWire31.rc b/installer/c/limewireExe/LimeWire31.rc
new file mode 100644
index 0000000000..386d2003b1
--- /dev/null
+++ b/installer/c/limewireExe/LimeWire31.rc
@@ -0,0 +1,113 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource1.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource1.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,2
+ PRODUCTVERSION 1,0,0,2
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "Comments", "The easiest and safest way to get music"
+            VALUE "CompanyName", "The MuWire Project"
+            VALUE "FileDescription", "MuWire"
+            VALUE "FileVersion", "1, 0, 0, 2"
+            VALUE "InternalName", "MuWire"
+            VALUE "LegalCopyright", "GPL"
+            VALUE "OriginalFilename", "MuWire.exe"
+            VALUE "ProductName", " MuWire"
+            VALUE "ProductVersion", "1, 0, 0, 2"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ICON1               ICON                    "merged icon.ico"
+IDI_ICON2               ICON                    "torrent.ico"
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/installer/c/limewireExe/errors.h b/installer/c/limewireExe/errors.h
new file mode 100644
index 0000000000..6802181d2a
--- /dev/null
+++ b/installer/c/limewireExe/errors.h
@@ -0,0 +1,11 @@
+#ifndef _LIME_ERRORS_H
+#define _LIME_ERRORS_h
+
+
+#define ERROR_COULDNT_LOAD_JVM 6
+#define ERROR_COULDNT_PARSE_ARGUMENTS 7
+#define ERROR_COULDNT_INITIALIZE_JVM 8
+#define ERROR_STARTING_PROGRAM 9
+#define ERROR_COULDNT_FIND_JVM 10
+
+#endif /* _LIME_ERRORS_H */
\ No newline at end of file
diff --git a/installer/c/limewireExe/java.c b/installer/c/limewireExe/java.c
new file mode 100644
index 0000000000..ddc9ffb794
--- /dev/null
+++ b/installer/c/limewireExe/java.c
@@ -0,0 +1,1042 @@
+/*
+ * Derived from the shared source for the 'java' command line tool.
+ *
+ * Original comments as follows:
+ * Shared source for 'java' command line tool.
+ *
+ * If JAVA_ARGS is defined, then acts as a launcher for applications. For
+ * instance, the JDK command line tools such as javac and javadoc (see
+ * makefiles for more details) are built with this program.  Any arguments
+ * prefixed with '-J' will be passed directly to the 'java' command.
+ */
+
+/*
+ * One job of the launcher is to remove command line options which the
+ * vm does not understand and will not process.  These options include
+ * options which select which style of vm is run (e.g. -client and
+ * -server) as well as options which select the data model to use.
+ * Additionally, for tools which invoke an underlying vm "-J-foo"
+ * options are turned into "-foo" options to the vm.  This option
+ * filtering is handled in a number of places in the launcher, some of
+ * it in machine-dependent code.  In this file, the function
+ * CheckJVMType removes vm style options and TranslateDashJArgs
+ * removes "-J" prefixes.  On unix platforms, the
+ * CreateExecutionEnvironment function from the unix java_md.c file
+ * processes and removes -d<n> options.  However, in case
+ * CreateExecutionEnvironment does not need to exec because
+ * LD_LIBRARY_PATH is set acceptably and the data model does not need
+ * to be changed, ParseArguments will screen out the redundant -d<n>
+ * options and prevent them from being passed to the vm; this is done
+ * by using the machine-dependent call
+ * RemovableMachineDependentOption.
+ */
+
+#include "errors.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "jni.h"
+#include "java.h"
+
+#ifndef FULL_VERSION
+#define FULL_VERSION JDK_MAJOR_VERSION "." JDK_MINOR_VERSION
+#endif
+
+
+static jboolean printVersion = JNI_FALSE; /* print and exit */
+static jboolean showVersion = JNI_FALSE;  /* print but continue */
+
+/*
+ * List of VM options to be specified when the VM is created.
+ */
+static JavaVMOption *options;
+static int numOptions, maxOptions;
+
+/*
+ * Prototypes for functions internal to launcher.
+ */
+static void AddOption(char *str, void *info);
+static void SetClassPath(char *s);
+static jboolean ParseArguments(int *pargc, char ***pargv, char **pjarfile,
+			       char **pclassname, int *pret);
+static jboolean InitializeJVM(JavaVM **pvm, JNIEnv **penv,
+			      InvocationFunctions *ifn);
+static jstring NewPlatformString(JNIEnv *env, char *s);
+static jobjectArray NewPlatformStringArray(JNIEnv *env, char **strv, int strc);
+static jclass LoadClass(JNIEnv *env, char *name);
+static jstring GetMainClassName(JNIEnv *env, char *jarname);
+static void SetJavaCommandLineProp(char* classname, char* jarfile, int argc, char** argv);
+
+
+static void PrintJavaVersion(JNIEnv *env);
+
+
+/* Support for options such as -hotspot, -classic etc. */
+#define INIT_MAX_KNOWN_VMS	10
+#define VM_UNKNOWN		-1
+#define VM_KNOWN		 0
+#define VM_ALIASED_TO		 1
+#define VM_WARN			 2
+#define VM_ERROR		 3
+struct vmdesc {
+    char *name;
+    int flag;
+    char *alias;
+};
+static struct vmdesc *knownVMs = NULL;
+static int knownVMsCount = 0;
+static int knownVMsLimit = 0;
+
+static void GrowKnownVMs();
+static int  KnownVMIndex(const char* name);
+static void FreeKnownVMs();
+
+/* flag which if set suppresses error messages from the launcher */
+static int noExitErrorMessage = 0;
+
+jboolean ServerClassMachine();
+
+/*
+ * Entry point.
+ */
+int
+launchJVM(int argc, char ** argv)
+{
+    JavaVM *vm = 0;
+    JNIEnv *env = 0;
+    char *jarfile = 0;
+    char *classname = 0;
+    char *s = 0;
+    char *main_class = NULL;
+    jstring mainClassName;
+    jclass mainClass;
+    jmethodID mainID;
+    jobjectArray mainArgs;
+    int ret;
+    InvocationFunctions ifn;
+    char jrepath[MAXPATHLEN], jvmpath[MAXPATHLEN];
+    char ** original_argv = argv;
+	int create_ret;
+
+    /* 
+     * Error message to print or display; by default the message will
+     * only be displayed in a window.
+     */
+    char * message = "Fatal exception occurred.  Program will exit.";
+    jboolean messageDest = JNI_FALSE;
+
+    /* copy original argv */
+    {
+      int i;
+      original_argv = (char**)MemAlloc(sizeof(char*)*(argc+1));
+      for(i = 0; i < argc+1; i++)
+		original_argv[i] = argv[i];
+    }
+
+    create_ret = CreateExecutionEnvironment(&argc, &argv,
+			       jrepath, sizeof(jrepath),
+			       jvmpath, sizeof(jvmpath),
+			       original_argv);
+	if(create_ret != 0)
+		return ERROR_COULDNT_FIND_JVM;
+
+    ifn.CreateJavaVM = 0;
+    ifn.GetDefaultJavaVMInitArgs = 0;
+
+    if (!LoadJavaVM(jvmpath, &ifn)) {
+		return ERROR_COULDNT_LOAD_JVM;
+    }
+
+	// ignore the program name when processing arguments.
+    ++argv;
+    --argc;
+
+    /* 
+     *  Parse command line options; if the return value of
+     *  ParseArguments is false, the program should exit.
+     */
+    if (!ParseArguments(&argc, &argv, &jarfile, &classname, &ret)) {
+      return ERROR_COULDNT_PARSE_ARGUMENTS;
+    }
+
+    /* Override class path if -jar flag was specified */
+    if (jarfile != 0) {
+	SetClassPath(jarfile);
+    }
+
+    /* set the -Dsun.java.command pseudo property */
+    SetJavaCommandLineProp(classname, jarfile, argc, argv);
+
+    /* Initialize the virtual machine */
+
+    if (!InitializeJVM(&vm, &env, &ifn)) {
+		ReportErrorMessage("Could not create the Java virtual machine.", JNI_TRUE);
+		return ERROR_COULDNT_INITIALIZE_JVM;
+    }
+
+    if (printVersion || showVersion) {
+        PrintJavaVersion(env);
+	if ((*env)->ExceptionOccurred(env)) {
+	    ReportExceptionDescription(env);
+	    goto leave;
+	}
+	if (printVersion) {
+	    ret = 0;
+	    message = NULL;
+	    goto leave;
+	}
+	if (showVersion) {
+	    fprintf(stderr, "\n");
+	}
+    }
+
+    /* If the user specified neither a class name nor a JAR file */
+    if (jarfile == 0 && classname == 0) {
+		message = NULL;
+		goto leave;
+    }
+
+    FreeKnownVMs();  /* after last possible PrintUsage() */
+
+
+    /* At this stage, argc/argv have the applications' arguments */
+
+    ret = 1;
+
+    /* Get the application's main class */
+    if (jarfile != 0) {
+	mainClassName = GetMainClassName(env, jarfile);
+	if ((*env)->ExceptionOccurred(env)) {
+	    ReportExceptionDescription(env);
+	    goto leave;
+	}
+	if (mainClassName == NULL) {
+	  const char * format = "Failed to load Main-Class manifest "
+	                        "attribute from\n%s";
+	  message = (char*)MemAlloc((strlen(format) + strlen(jarfile)) *
+				    sizeof(char));
+	  sprintf(message, format, jarfile);
+	  messageDest = JNI_TRUE;
+	  goto leave;
+	}
+	classname = (char *)(*env)->GetStringUTFChars(env, mainClassName, 0);
+	if (classname == NULL) {
+	    ReportExceptionDescription(env);
+	    goto leave;
+	}
+	mainClass = LoadClass(env, classname);
+	if(mainClass == NULL) { /* exception occured */
+	    ReportExceptionDescription(env);
+	    message = "Could not find the main class.  Program will exit.";
+	    goto leave;
+	}
+	(*env)->ReleaseStringUTFChars(env, mainClassName, classname);
+    } else {
+      mainClassName = NewPlatformString(env, classname);
+      if (mainClassName == NULL) {
+	const char * format = "Failed to load Main Class: %s";
+	message = (char *)MemAlloc((strlen(format) + strlen(classname)) * 
+				   sizeof(char) );
+	sprintf(message, format, classname); 
+	messageDest = JNI_TRUE;
+	goto leave;
+      }
+      classname = (char *)(*env)->GetStringUTFChars(env, mainClassName, 0);
+      if (classname == NULL) {
+	ReportExceptionDescription(env);
+	goto leave;
+      }
+      mainClass = LoadClass(env, classname);
+      if(mainClass == NULL) { /* exception occured */
+	ReportExceptionDescription(env);
+	message = "Could not find the main class. Program will exit.";
+	goto leave;
+      }
+      (*env)->ReleaseStringUTFChars(env, mainClassName, classname);
+    }
+
+    /* Get the application's main method */
+    mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
+				       "([Ljava/lang/String;)V");
+    if (mainID == NULL) {
+	if ((*env)->ExceptionOccurred(env)) {
+	    ReportExceptionDescription(env);
+	} else {
+	  message = "No main method found in specified class.";
+	  messageDest = JNI_TRUE;
+	}
+	goto leave;
+    }
+
+    {    /* Make sure the main method is public */
+	jint mods;
+	jmethodID mid;
+	jobject obj = (*env)->ToReflectedMethod(env, mainClass, 
+						mainID, JNI_TRUE);
+
+	if( obj == NULL) { /* exception occurred */
+	    ReportExceptionDescription(env);
+	    goto leave;
+	}
+
+	mid = 
+	  (*env)->GetMethodID(env, 
+			      (*env)->GetObjectClass(env, obj),
+			      "getModifiers", "()I");
+	if ((*env)->ExceptionOccurred(env)) {
+	    ReportExceptionDescription(env);
+	    goto leave;
+	}
+
+	mods = (*env)->CallIntMethod(env, obj, mid);
+	if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
+	    message = "Main method not public.";
+	    messageDest = JNI_TRUE;
+	    goto leave;
+	}
+    }
+
+    /* Build argument array */
+    mainArgs = NewPlatformStringArray(env, argv, argc);
+    if (mainArgs == NULL) {
+	ReportExceptionDescription(env);
+	goto leave;
+    }
+
+    /* Invoke main method. */
+    (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
+    if ((*env)->ExceptionOccurred(env)) {
+	/* 
+	 * Formerly, we used to call the "uncaughtException" method of
+	 * the main thread group, but this was later shown to be
+	 * unnecessary since the default definition merely printed out
+	 * the same exception stack trace as ExceptionDescribe and
+	 * could never actually be overridden by application programs.
+	 */
+	ReportExceptionDescription(env);
+	goto leave;
+    }
+
+    /*
+     * Detach the current thread so that it appears to have exited when
+     * the application's main method exits.
+     */
+    if ((*vm)->DetachCurrentThread(vm) != 0) {
+	message = "Could not detach main thread.";
+	messageDest = JNI_TRUE;
+	goto leave;
+    }
+    ret = 0;
+    message = NULL;
+
+leave:
+    (*vm)->DestroyJavaVM(vm);
+    if(message != NULL && !noExitErrorMessage)
+      ReportErrorMessage(message, messageDest);
+
+	return ERROR_STARTING_PROGRAM;
+}
+
+
+/*
+ * Checks the command line options to find which JVM type was
+ * specified.  If no command line option was given for the JVM type,
+ * the default type is used.  The environment variable
+ * JDK_ALTERNATE_VM and the command line option -XXaltjvm= are also
+ * checked as ways of specifying which JVM type to invoke.
+ */
+char *
+CheckJvmType(int *pargc, char ***argv, jboolean speculative) {
+    int i, argi;
+    int argc;
+    char **newArgv;
+    int newArgvIdx = 0;
+    int isVMType;
+    int jvmidx = -1;
+    char *jvmtype = getenv("JDK_ALTERNATE_VM");
+
+    argc = *pargc;
+
+    /* To make things simpler we always copy the argv array */
+    newArgv = MemAlloc((argc + 1) * sizeof(char *));
+
+    /* The program name is always present */
+    newArgv[newArgvIdx++] = (*argv)[0];
+
+    for (argi = 1; argi < argc; argi++) {
+	char *arg = (*argv)[argi];
+        isVMType = 0;
+
+ 	if (strcmp(arg, "-classpath") == 0 || 
+ 	    strcmp(arg, "-cp") == 0) {
+            newArgv[newArgvIdx++] = arg;
+ 	    argi++;
+            if (argi < argc) {
+                newArgv[newArgvIdx++] = (*argv)[argi];
+            }
+ 	    continue;
+ 	}
+ 	if (arg[0] != '-') break;
+
+ 	/* Did the user pass an explicit VM type? */
+	i = KnownVMIndex(arg);
+	if (i >= 0) {
+	    jvmtype = knownVMs[jvmidx = i].name + 1; /* skip the - */
+	    isVMType = 1;
+	    *pargc = *pargc - 1;
+	}
+
+	/* Did the user specify an "alternate" VM? */
+	else if (strncmp(arg, "-XXaltjvm=", 10) == 0 || strncmp(arg, "-J-XXaltjvm=", 12) == 0) {
+	    isVMType = 1;
+	    jvmtype = arg+((arg[1]=='X')? 10 : 12);
+	    jvmidx = -1;
+	}
+
+        if (!isVMType) {
+            newArgv[newArgvIdx++] = arg;
+        }
+    }
+
+    /* 
+     * Finish copying the arguments if we aborted the above loop.
+     * NOTE that if we aborted via "break" then we did NOT copy the
+     * last argument above, and in addition argi will be less than
+     * argc.
+     */
+    while (argi < argc) {
+        newArgv[newArgvIdx++] = (*argv)[argi];
+        argi++;
+    }
+
+    /* argv is null-terminated */
+    newArgv[newArgvIdx] = 0;
+
+    /* Copy back argv */
+    *argv = newArgv;
+    *pargc = newArgvIdx;
+
+    /* use the default VM type if not specified (no alias processing) */
+    if (jvmtype == NULL)
+	return knownVMs[0].name+1;
+
+    /* if using an alternate VM, no alias processing */
+    if (jvmidx < 0)
+      return jvmtype;
+
+    /* Resolve aliases first */
+    {    
+      int loopCount = 0;
+      while (knownVMs[jvmidx].flag == VM_ALIASED_TO) {
+        int nextIdx = KnownVMIndex(knownVMs[jvmidx].alias);
+
+        if (loopCount > knownVMsCount) {
+	  if (!speculative) {
+	    ReportErrorMessage("Error: Corrupt jvm.cfg file; cycle in alias list.",
+			       JNI_TRUE);
+	    return "ERROR";
+	  } else {
+	    return "ERROR";
+	    /* break; */
+	  }
+        }
+
+        if (nextIdx < 0) {
+	  if (!speculative) {
+            ReportErrorMessage2("Error: Unable to resolve VM alias %s",
+				knownVMs[jvmidx].alias, JNI_TRUE);
+            return "ERROR";
+	  } else {
+	    return "ERROR";
+	  }
+        }
+        jvmidx = nextIdx;
+        jvmtype = knownVMs[jvmidx].name+1;
+	loopCount++;
+      }
+    }
+
+    switch (knownVMs[jvmidx].flag) {
+    case VM_WARN:
+        if (!speculative) {
+	    fprintf(stderr, "Warning: %s VM not supported; %s VM will be used\n", 
+		    jvmtype, knownVMs[0].name + 1);
+        }
+	jvmtype = knownVMs[jvmidx=0].name + 1;
+	/* fall through */
+    case VM_KNOWN:
+	break;
+    case VM_ERROR:
+        if (!speculative) {
+	    ReportErrorMessage2("Error: %s VM not supported", jvmtype, JNI_TRUE);
+	    return "ERROR";
+        } else {
+	    return "ERROR";
+        }
+    }
+
+    return jvmtype;
+}
+
+
+/*
+ * Adds a new VM option with the given given name and value.
+ */
+static void
+AddOption(char *str, void *info)
+{
+    /*
+     * Expand options array if needed to accommodate at least one more
+     * VM option.
+     */
+    if (numOptions >= maxOptions) {
+	if (options == 0) {
+	    maxOptions = 4;
+	    options = MemAlloc(maxOptions * sizeof(JavaVMOption));
+	} else {
+	    JavaVMOption *tmp;
+	    maxOptions *= 2;
+	    tmp = MemAlloc(maxOptions * sizeof(JavaVMOption));
+	    memcpy(tmp, options, numOptions * sizeof(JavaVMOption));
+	    free(options);
+	    options = tmp;
+	}
+    }
+    options[numOptions].optionString = str;
+    options[numOptions++].extraInfo = info;
+}
+
+static void
+SetClassPath(char *s)
+{
+    char *def = MemAlloc(strlen(s) + 40);
+    sprintf(def, "-Djava.class.path=%s", s);
+    AddOption(def, NULL);
+}
+
+/*
+ * Parses command line arguments.  Returns JNI_FALSE if launcher
+ * should exit without starting vm (e.g. certain version and usage
+ * options); returns JNI_TRUE if vm needs to be started to process
+ * given options.  *pret (the launcher process return value) is set to
+ * 0 for a normal exit.
+ */
+static jboolean
+ParseArguments(int *pargc, char ***pargv, char **pjarfile,
+		       char **pclassname, int *pret)
+{
+    int argc = *pargc;
+    char **argv = *pargv;
+    jboolean jarflag = JNI_FALSE;
+    char *arg;
+
+    *pret = 1;
+    while ((arg = *argv) != 0 && *arg == '-') {
+		argv++; --argc;
+		if (strcmp(arg, "-classpath") == 0 || strcmp(arg, "-cp") == 0) {
+			if (argc < 1) {
+				ReportErrorMessage2("%s requires class path specification",
+						arg, JNI_TRUE);
+			return JNI_FALSE;
+			}
+			SetClassPath(*argv);
+			argv++; --argc;
+		} else if (strcmp(arg, "-jar") == 0) {
+			jarflag = JNI_TRUE;
+		} else if (strcmp(arg, "-version") == 0) {
+			printVersion = JNI_TRUE;
+			return JNI_TRUE;
+		} else if (strcmp(arg, "-showversion") == 0) {
+			showVersion = JNI_TRUE;
+		} else if (strcmp(arg, "-X") == 0) {
+			*pret = 0;
+			return JNI_FALSE;
+	/*
+	* The following case provide backward compatibility with old-style
+	* command line options.
+	*/
+		} else if (strcmp(arg, "-verbosegc") == 0) {
+			AddOption("-verbose:gc", NULL);
+		} else if (strcmp(arg, "-t") == 0) {
+			AddOption("-Xt", NULL);
+		} else if (strcmp(arg, "-tm") == 0) {
+			AddOption("-Xtm", NULL);
+		} else if (strcmp(arg, "-debug") == 0) {
+			AddOption("-Xdebug", NULL);
+		} else if (strcmp(arg, "-noclassgc") == 0) {
+			AddOption("-Xnoclassgc", NULL);
+		} else if (strcmp(arg, "-Xfuture") == 0) {
+			AddOption("-Xverify:all", NULL);
+		} else if (strcmp(arg, "-verify") == 0) {
+			AddOption("-Xverify:all", NULL);
+		} else if (strcmp(arg, "-verifyremote") == 0) {
+			AddOption("-Xverify:remote", NULL);
+		} else if (strcmp(arg, "-noverify") == 0) {
+			AddOption("-Xverify:none", NULL);
+		} else if (strcmp(arg, "-XXsuppressExitMessage") == 0) {
+			noExitErrorMessage = 1;
+		} else if (strncmp(arg, "-prof", 5) == 0) {
+			char *p = arg + 5;
+			char *tmp = MemAlloc(strlen(arg) + 50);
+			if (*p) {
+				sprintf(tmp, "-Xrunhprof:cpu=old,file=%s", p + 1);
+			} else {
+				sprintf(tmp, "-Xrunhprof:cpu=old,file=java.prof");
+			}
+			AddOption(tmp, NULL);
+		} else if (strncmp(arg, "-ss", 3) == 0 ||
+			strncmp(arg, "-oss", 4) == 0 ||
+			strncmp(arg, "-ms", 3) == 0 ||
+			strncmp(arg, "-mx", 3) == 0) {
+			char *tmp = MemAlloc(strlen(arg) + 6);
+			sprintf(tmp, "-X%s", arg + 1); /* skip '-' */
+			AddOption(tmp, NULL);
+		} else if (strcmp(arg, "-checksource") == 0 ||
+			strcmp(arg, "-cs") == 0 ||
+			strcmp(arg, "-noasyncgc") == 0) {
+			/* No longer supported */
+			fprintf(stderr,
+				"Warning: %s option is no longer supported.\n",
+				arg);
+		} else if (strncmp(arg, "-version:", 9) == 0 ||
+					strcmp(arg, "-no-jre-restrict-search") == 0 ||
+					strcmp(arg, "-jre-restrict-search") == 0) {
+			; /* Ignore machine independent options already handled */
+		} else if (RemovableMachineDependentOption(arg) ) {
+			; /* Do not pass option to vm. */
+		}
+		else {
+			AddOption(arg, NULL);
+		}
+    }
+
+    if (--argc >= 0) {
+        if (jarflag) {
+			*pjarfile = *argv++;
+			*pclassname = 0;
+		} else {
+		    *pjarfile = 0;
+			*pclassname = *argv++;
+		}
+		*pargc = argc;
+		*pargv = argv;
+    }
+
+    return JNI_TRUE;
+}
+
+/*
+ * Initializes the Java Virtual Machine. Also frees options array when
+ * finished.
+ */
+static jboolean
+InitializeJVM(JavaVM **pvm, JNIEnv **penv, InvocationFunctions *ifn)
+{
+    JavaVMInitArgs args;
+    jint r;
+
+    memset(&args, 0, sizeof(args));
+    args.version  = JNI_VERSION_1_2;
+    args.nOptions = numOptions;
+    args.options  = options;
+    args.ignoreUnrecognized = JNI_FALSE;
+
+    r = ifn->CreateJavaVM(pvm, (void **)penv, &args);
+    free(options);
+    return r == JNI_OK;
+}
+
+
+#define NULL_CHECK0(e) if ((e) == 0) return 0
+#define NULL_CHECK(e) if ((e) == 0) return
+
+/*
+ * Returns a pointer to a block of at least 'size' bytes of memory.
+ * Prints error message and exits if the memory could not be allocated.
+ */
+void *
+MemAlloc(size_t size)
+{
+    void *p = malloc(size);
+    if (p == 0) {
+	perror("malloc");
+	exit(1);
+    }
+    return p;
+}
+
+/*
+ * Returns a new Java string object for the specified platform string.
+ */
+static jstring
+NewPlatformString(JNIEnv *env, char *s)
+{    
+    int len = (int)strlen(s);
+    jclass cls;
+    jmethodID mid;
+    jbyteArray ary;
+
+    if (s == NULL)
+	return 0;
+    NULL_CHECK0(cls = (*env)->FindClass(env, "java/lang/String"));
+    NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "<init>", "([B)V"));
+    ary = (*env)->NewByteArray(env, len);
+    if (ary != 0) {
+	jstring str = 0;
+	(*env)->SetByteArrayRegion(env, ary, 0, len, (jbyte *)s);
+	if (!(*env)->ExceptionOccurred(env)) {
+	    str = (*env)->NewObject(env, cls, mid, ary);
+	}
+	(*env)->DeleteLocalRef(env, ary);
+	return str;
+    }
+    return 0;
+}
+
+/*
+ * Returns a new array of Java string objects for the specified
+ * array of platform strings.
+ */
+static jobjectArray
+NewPlatformStringArray(JNIEnv *env, char **strv, int strc)
+{
+    jarray cls;
+    jarray ary;
+    int i;
+
+    NULL_CHECK0(cls = (*env)->FindClass(env, "java/lang/String"));
+    NULL_CHECK0(ary = (*env)->NewObjectArray(env, strc, cls, 0));
+    for (i = 0; i < strc; i++) {
+	jstring str = NewPlatformString(env, *strv++);
+	NULL_CHECK0(str);
+	(*env)->SetObjectArrayElement(env, ary, i, str);
+	(*env)->DeleteLocalRef(env, str);
+    }
+    return ary;
+}
+
+/*
+ * Loads a class, convert the '.' to '/'.
+ */
+static jclass
+LoadClass(JNIEnv *env, char *name)
+{
+    char *buf = MemAlloc(strlen(name) + 1);
+    char *s = buf, *t = name, c;
+    jclass cls;
+
+    do {
+        c = *t++;
+	*s++ = (c == '.') ? '/' : c;
+    } while (c != '\0');
+    cls = (*env)->FindClass(env, buf);
+    free(buf);
+
+    return cls;
+}
+
+/*
+ * Returns the main class name for the specified jar file.
+ */
+static jstring
+GetMainClassName(JNIEnv *env, char *jarname)
+{
+#define MAIN_CLASS "Main-Class"
+    jclass cls;
+    jmethodID mid;
+    jobject jar, man, attr;
+    jstring str, result = 0;
+
+    NULL_CHECK0(cls = (*env)->FindClass(env, "java/util/jar/JarFile"));
+    NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "<init>",
+					  "(Ljava/lang/String;)V"));
+    NULL_CHECK0(str = NewPlatformString(env, jarname));
+    NULL_CHECK0(jar = (*env)->NewObject(env, cls, mid, str));
+    NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "getManifest",
+					  "()Ljava/util/jar/Manifest;"));
+    man = (*env)->CallObjectMethod(env, jar, mid);
+    if (man != 0) {
+	NULL_CHECK0(mid = (*env)->GetMethodID(env,
+				    (*env)->GetObjectClass(env, man),
+				    "getMainAttributes",
+				    "()Ljava/util/jar/Attributes;"));
+	attr = (*env)->CallObjectMethod(env, man, mid);
+	if (attr != 0) {
+	    NULL_CHECK0(mid = (*env)->GetMethodID(env,
+				    (*env)->GetObjectClass(env, attr),
+				    "getValue",
+				    "(Ljava/lang/String;)Ljava/lang/String;"));
+	    NULL_CHECK0(str = NewPlatformString(env, MAIN_CLASS));
+	    result = (*env)->CallObjectMethod(env, attr, mid, str);
+	}
+    }
+    return result;
+}
+
+/*
+ * inject the -Dsun.java.command pseudo property into the args structure
+ * this pseudo property is used in the HotSpot VM to expose the
+ * Java class name and arguments to the main method to the VM. The
+ * HotSpot VM uses this pseudo property to store the Java class name
+ * (or jar file name) and the arguments to the class's main method
+ * to the instrumentation memory region. The sun.java.command pseudo
+ * property is not exported by HotSpot to the Java layer.
+ */
+void
+SetJavaCommandLineProp(char *classname, char *jarfile,
+		       int argc, char **argv)
+{
+
+    int i = 0;
+    size_t len = 0;
+    char* javaCommand = NULL;
+    char* dashDstr = "-Dsun.java.command=";
+
+    if (classname == NULL && jarfile == NULL) {
+        /* unexpected, one of these should be set. just return without
+         * setting the property
+         */
+        return;
+    }
+
+    /* if the class name is not set, then use the jarfile name */
+    if (classname == NULL) {
+        classname = jarfile;
+    }
+
+    /* determine the amount of memory to allocate assuming
+     * the individual components will be space separated
+     */
+    len = strlen(classname);
+    for (i = 0; i < argc; i++) {
+        len += strlen(argv[i]) + 1;
+    }
+
+    /* allocate the memory */
+    javaCommand = (char*) MemAlloc(len + strlen(dashDstr) + 1);
+
+    /* build the -D string */
+    *javaCommand = '\0';
+    strcat(javaCommand, dashDstr);
+    strcat(javaCommand, classname);
+
+    for (i = 0; i < argc; i++) {
+        /* the components of the string are space separated. In
+         * the case of embedded white space, the relationship of
+         * the white space separated components to their true
+         * positional arguments will be ambiguous. This issue may
+         * be addressed in a future release.
+         */
+        strcat(javaCommand, " ");
+        strcat(javaCommand, argv[i]);
+    }
+
+    AddOption(javaCommand, NULL);
+}
+
+/*
+ * Prints the version information from the java.version and other properties.
+ */
+static void
+PrintJavaVersion(JNIEnv *env)
+{
+    jclass ver;
+    jmethodID print;
+
+    NULL_CHECK(ver = (*env)->FindClass(env, "sun/misc/Version"));
+    NULL_CHECK(print = (*env)->GetStaticMethodID(env, ver, "print", "()V"));
+
+    (*env)->CallStaticVoidMethod(env, ver, print);
+}
+
+
+/*
+ * Read the jvm.cfg file and fill the knownJVMs[] array.
+ *
+ * The functionality of the jvm.cfg file is subject to change without 
+ * notice and the mechanism will be removed in the future.
+ *
+ * The lexical structure of the jvm.cfg file is as follows:
+ *
+ *     jvmcfg         :=  { vmLine }
+ *     vmLine         :=  knownLine 
+ *                    |   aliasLine 
+ *                    |   warnLine 
+ *                    |   errorLine 
+ *                    |   commentLine
+ *     knownLine      :=  flag  "KNOWN"                  EOL
+ *     warnLine       :=  flag  "WARN"                   EOL
+ *     errorLine      :=  flag  "ERROR"                  EOL
+ *     aliasLine      :=  flag  "ALIASED_TO"       flag  EOL
+ *     commentLine    :=  "#" text                       EOL
+ *     flag           :=  "-" identifier
+ *
+ * The semantics are that when someone specifies a flag on the command line:
+ * - if the flag appears on a knownLine, then the identifier is used as 
+ *   the name of the directory holding the JVM library (the name of the JVM).
+ * - if the flag appears as the first flag on an aliasLine, the identifier 
+ *   of the second flag is used as the name of the JVM.
+ * - if the flag appears on a warnLine, the identifier is used as the 
+ *   name of the JVM, but a warning is generated.
+ * - if the flag appears on an errorLine, an error is generated.
+ * If no flag is given on the command line, the first vmLine of the jvm.cfg 
+ * file determines the name of the JVM.
+ *
+ * The intent of the jvm.cfg file is to allow several JVM libraries to 
+ * be installed in different subdirectories of a single JRE installation, 
+ * for space-savings and convenience in testing.  
+ * The intent is explicitly not to provide a full aliasing or predicate
+ * mechanism.
+ */
+jint
+ReadKnownVMs(const char *jrepath, char * arch, jboolean speculative)
+{
+    FILE *jvmCfg;
+    char jvmCfgName[MAXPATHLEN+20];
+    char line[MAXPATHLEN+20];
+    int cnt = 0;
+    int lineno = 0;
+    int vmType;
+    char *tmpPtr;
+    char *altVMName;
+	struct stat s;
+    static char *whiteSpace = " \t";
+
+	sprintf(jvmCfgName, "%s\\lib\\%s\\jvm.cfg\0", jrepath, arch);
+	if(stat(jvmCfgName, &s) != 0)
+		// try without arch -- for java 1.3 compatability
+		sprintf(jvmCfgName, "%s\\lib\\jvm.cfg\0", jrepath);
+    
+    jvmCfg = fopen(jvmCfgName, "r");
+    if (jvmCfg == NULL) {
+		if (!speculative) {
+			ReportErrorMessage2("Error: could not open `%s'", jvmCfgName,
+					JNI_TRUE);
+			return -1;
+		} else {
+			return -1;
+		}
+    }
+    while (fgets(line, sizeof(line), jvmCfg) != NULL) {
+        vmType = VM_UNKNOWN;
+        lineno++;
+        if (line[0] == '#')
+            continue;
+        if (line[0] != '-') {
+            fprintf(stderr, "Warning: no leading - on line %d of `%s'\n",
+                    lineno, jvmCfgName);
+        }
+        if (cnt >= knownVMsLimit) {
+            GrowKnownVMs(cnt);
+        }
+        line[strlen(line)-1] = '\0'; /* remove trailing newline */
+        tmpPtr = line + strcspn(line, whiteSpace);
+        if (*tmpPtr == 0) {
+            fprintf(stderr, "Warning: missing VM type on line %d of `%s'\n",
+                    lineno, jvmCfgName);
+			vmType = VM_KNOWN; // assume known, for java 1.3 compatability
+        } else {
+            /* Null-terminate this string for strdup below */
+            *tmpPtr++ = 0;
+            tmpPtr += strspn(tmpPtr, whiteSpace);
+            if (*tmpPtr == 0) {
+                fprintf(stderr, "Warning: missing VM type on line %d of `%s'\n",
+                        lineno, jvmCfgName);
+            } else {
+                if (!strncmp(tmpPtr, "KNOWN", strlen("KNOWN"))) {
+                    vmType = VM_KNOWN;
+                } else if (!strncmp(tmpPtr, "ALIASED_TO", strlen("ALIASED_TO"))) {
+                    tmpPtr += strcspn(tmpPtr, whiteSpace);
+                    if (*tmpPtr != 0) {
+                        tmpPtr += strspn(tmpPtr, whiteSpace);
+                    }
+                    if (*tmpPtr == 0) {
+                        fprintf(stderr, "Warning: missing VM alias on line %d of `%s'\n",
+                                lineno, jvmCfgName);
+                    } else {
+                        /* Null terminate altVMName */
+                        altVMName = tmpPtr;
+                        tmpPtr += strcspn(tmpPtr, whiteSpace);
+                        *tmpPtr = 0;
+                        vmType = VM_ALIASED_TO;
+                    }
+                } else if (!strncmp(tmpPtr, "WARN", strlen("WARN"))) {
+                    vmType = VM_WARN;
+                } else if (!strncmp(tmpPtr, "ERROR", strlen("ERROR"))) {
+                    vmType = VM_ERROR;
+                } else {
+                    fprintf(stderr, "Warning: unknown VM type on line %d of `%s'\n",
+                            lineno, &jvmCfgName[0]);
+                    vmType = VM_KNOWN;
+                }
+            }
+        }
+
+        if (vmType != VM_UNKNOWN) {
+            knownVMs[cnt].name = strdup(line);
+            knownVMs[cnt].flag = vmType;
+            switch (vmType) {
+            default:
+                break;
+            case VM_ALIASED_TO:
+                knownVMs[cnt].alias = strdup(altVMName);
+                break;
+            }
+            cnt++;
+        }
+    }
+    fclose(jvmCfg);
+    knownVMsCount = cnt;
+
+
+    return cnt;
+}
+
+
+static void
+GrowKnownVMs(int minimum)
+{
+    struct vmdesc* newKnownVMs;
+    int newMax;
+
+    newMax = (knownVMsLimit == 0 ? INIT_MAX_KNOWN_VMS : (2 * knownVMsLimit));
+    if (newMax <= minimum) {
+        newMax = minimum;
+    }
+    newKnownVMs = (struct vmdesc*) MemAlloc(newMax * sizeof(struct vmdesc));
+    if (knownVMs != NULL) {
+        memcpy(newKnownVMs, knownVMs, knownVMsLimit * sizeof(struct vmdesc));
+    }
+    free(knownVMs);
+    knownVMs = newKnownVMs;
+    knownVMsLimit = newMax;
+}
+
+
+/* Returns index of VM or -1 if not found */
+static int
+KnownVMIndex(const char* name)
+{
+    int i;
+    if (strncmp(name, "-J", 2) == 0) name += 2;
+    for (i = 0; i < knownVMsCount; i++) {
+        if (!strcmp(name, knownVMs[i].name)) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+static void
+FreeKnownVMs()
+{
+    int i;
+    for (i = 0; i < knownVMsCount; i++) {
+        free(knownVMs[i].name);
+        knownVMs[i].name = NULL;
+    }
+    free(knownVMs);
+}
diff --git a/installer/c/limewireExe/java.h b/installer/c/limewireExe/java.h
new file mode 100644
index 0000000000..37b0754b9b
--- /dev/null
+++ b/installer/c/limewireExe/java.h
@@ -0,0 +1,76 @@
+/*
+ * @(#)java.h	1.23 04/04/24
+ *
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+/* Backported from Tiger (1.5) java.h	1.26 04/01/12 */
+
+#ifndef _JAVA_H_
+#define _JAVA_H_
+
+/*
+ * Get system specific defines.
+ */
+#include "jni.h"
+#include "java_md.h"
+
+/*
+ * Pointers to the needed JNI invocation API, initialized by LoadJavaVM.
+ */
+typedef jint (JNICALL *CreateJavaVM_t)(JavaVM **pvm, void **env, void *args);
+typedef jint (JNICALL *GetDefaultJavaVMInitArgs_t)(void *args);
+
+typedef struct {
+    CreateJavaVM_t CreateJavaVM;
+    GetDefaultJavaVMInitArgs_t GetDefaultJavaVMInitArgs;
+} InvocationFunctions;
+
+/*
+ * Prototypes for launcher functions in the system specific java_md.c.
+ */
+
+jboolean
+LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn);
+
+jboolean
+GetApplicationHome(char *buf, jint bufsize);
+
+const char *
+GetArch();
+
+int CreateExecutionEnvironment(int *_argc,
+				       char ***_argv,
+				       char jrepath[],
+				       jint so_jrepath,
+				       char jvmpath[],
+				       jint so_jvmpath,
+				       char **original_argv);
+
+/*
+ * Report an error message to stderr or a window as appropriate.  The
+ * flag always is set to JNI_TRUE if message is to be reported to both
+ * strerr and windows and set to JNI_FALSE if the message should only
+ * be sent to a window.
+ */
+void ReportErrorMessage(char * message, jboolean always);
+void ReportErrorMessage2(char * format, char * string, jboolean always);
+
+/*
+ * Report an exception which terminates the vm to stderr or a window
+ * as appropriate.
+ */
+void ReportExceptionDescription(JNIEnv * env);
+
+jboolean RemovableMachineDependentOption(char * option);
+void PrintMachineDependentOptions();
+
+/* 
+ * Functions defined in java.c and used in java_md.c.
+ */
+jint ReadKnownVMs(const char *jrepath, char * arch, jboolean speculative); 
+char *CheckJvmType(int *argc, char ***argv, jboolean speculative);
+void* MemAlloc(size_t size);
+
+#endif /* _JAVA_H_ */
diff --git a/installer/c/limewireExe/java_md.c b/installer/c/limewireExe/java_md.c
new file mode 100644
index 0000000000..9f336c0c97
--- /dev/null
+++ b/installer/c/limewireExe/java_md.c
@@ -0,0 +1,388 @@
+/**
+ * Derived from the shared source for the 'java' commandline tool.
+ */
+
+/* Backported from Tiger (1.5) java_md.c	1.40 04/01/12 */
+/* AMD64 support removed */
+
+#include <windows.h>
+#include <process.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "jni.h"
+#include "java.h"
+
+#define JVM_DLL "jvm.dll"
+#define JAVA_DLL "java.dll"
+
+/*
+ * Prototypes.
+ */
+static jboolean GetPublicJREHome(char *path, jint pathsize);
+static jboolean GetJVMPath(const char *jrepath, const char *jvmtype,
+			   char *jvmpath, jint jvmpathsize);
+static jboolean GetJREPath(char *path, jint pathsize);
+
+const char *
+GetArch()
+{
+#ifdef _WIN64
+    return "ia64";
+#else
+    return "i386";
+#endif
+}
+
+/*
+ *
+ */
+int
+CreateExecutionEnvironment(int *_argc,
+			   char ***_argv,
+			   char jrepath[],
+			   jint so_jrepath,
+			   char jvmpath[],
+			   jint so_jvmpath,
+			   char **original_argv) {
+   char * jvmtype;
+
+    /* Find out where the JRE is that we will be using. */
+    if (!GetJREPath(jrepath, so_jrepath)) {
+	ReportErrorMessage("Could not find a suitable Java 2 Runtime Environment.",
+			   JNI_TRUE);
+		return 1;
+    }
+
+    /* Find the specified JVM type */
+    if (ReadKnownVMs(jrepath, (char*)GetArch(), JNI_FALSE) < 1) {
+	ReportErrorMessage("Error: no known VMs. (check for corrupt jvm.cfg file)", 
+			   JNI_TRUE);
+		return 1;
+    }
+    jvmtype = CheckJvmType(_argc, _argv, JNI_FALSE);
+
+    jvmpath[0] = '\0';
+    if (!GetJVMPath(jrepath, jvmtype, jvmpath, so_jvmpath)) {
+        char * message=NULL;
+	const char * format = "Error: no `%s' JVM at `%s'.";
+	message = (char *)MemAlloc((strlen(format)+strlen(jvmtype)+
+				    strlen(jvmpath)) * sizeof(char));
+	sprintf(message,format, jvmtype, jvmpath); 
+	ReportErrorMessage(message, JNI_TRUE);
+		return 1;
+    }
+    /* If we got here, jvmpath has been correctly initialized. */
+	return 0;
+
+}
+
+/*
+ * Find path to JRE based on .exe's location or registry settings.
+ */
+jboolean
+GetJREPath(char *path, jint pathsize)
+{
+    char javadll[MAXPATHLEN];
+    struct stat s;
+//
+//    if (GetApplicationHome(path, pathsize)) {
+//		/* Is JRE co-located with the application? */
+//		sprintf(javadll, "%s\\bin\\" JAVA_DLL, path);
+//		if (stat(javadll, &s) == 0) {
+//			goto found;
+//		}
+
+//		/* Does this app ship a private JRE in <apphome>\jre directory? */
+//		sprintf(javadll, "%s\\jre\\bin\\" JAVA_DLL, path);
+//		if (stat(javadll, &s) == 0) {
+//			strcat(path, "\\jre");
+//			goto found;
+//		}
+//    }
+
+    /* Look for a public JRE on this machine. */
+    if (GetPublicJREHome(path, pathsize))
+		goto found;
+
+    fprintf(stderr, "Error: could not find " JAVA_DLL "\n");
+    return JNI_FALSE;
+
+ found:
+	
+	{
+		// trick into thinking that the jre/bin path is in the PATH
+		char *oldPath = getenv("PATH");
+		char *newPath;
+		if(oldPath != NULL) {
+			newPath = MemAlloc(strlen(oldPath) + strlen(path) + 6 + 6 + 1); // PATH=<new>\bin;<old>
+			sprintf(newPath, "PATH=%s\\bin;%s", path, oldPath);
+		} else {
+			newPath = MemAlloc(strlen(path) + 6 + 1);
+			sprintf(newPath, "PATH=%s\\bin", path);
+		}
+		_putenv(newPath);
+		free(newPath);
+	}
+
+    return JNI_TRUE;
+}
+
+/*
+ * Given a JRE location and a JVM type, construct what the name the
+ * JVM shared library will be.  Return true, if such a library
+ * exists, false otherwise.
+ */
+static jboolean
+GetJVMPath(const char *jrepath, const char *jvmtype,
+	   char *jvmpath, jint jvmpathsize)
+{
+    struct stat s;
+    if (strchr(jvmtype, '/') || strchr(jvmtype, '\\')) {
+	sprintf(jvmpath, "%s\\" JVM_DLL, jvmtype);
+    } else {
+	sprintf(jvmpath, "%s\\bin\\%s\\" JVM_DLL, jrepath, jvmtype);
+    }
+    if (stat(jvmpath, &s) == 0) {
+	return JNI_TRUE;
+    } else {
+	return JNI_FALSE;
+    }
+}
+
+/*
+ * Load a jvm from "jvmpath" and initialize the invocation functions.
+ */
+jboolean
+LoadJavaVM(const char *jvmpath, InvocationFunctions *ifn)
+{
+    HINSTANCE handle;
+
+    /* Load the Java VM DLL */
+    if ((handle = LoadLibrary(jvmpath)) == 0) {
+	ReportErrorMessage2("Error loading: %s", (char *)jvmpath, JNI_TRUE);
+	return JNI_FALSE;
+    }
+
+    /* Now get the function addresses */
+    ifn->CreateJavaVM =
+	(void *)GetProcAddress(handle, "JNI_CreateJavaVM");
+    ifn->GetDefaultJavaVMInitArgs =
+	(void *)GetProcAddress(handle, "JNI_GetDefaultJavaVMInitArgs");
+    if (ifn->CreateJavaVM == 0 || ifn->GetDefaultJavaVMInitArgs == 0) {
+	ReportErrorMessage2("Error: can't find JNI interfaces in: %s", 
+			    (char *)jvmpath, JNI_TRUE);
+	return JNI_FALSE;
+    }
+
+    return JNI_TRUE;
+}
+
+
+/*
+ * If app is "c:\foo\bin\javac", then put "c:\foo" into buf.
+ */
+jboolean
+GetApplicationHome(char *buf, jint bufsize)
+{
+    char *cp;
+    GetModuleFileName(0, buf, bufsize);
+    *strrchr(buf, '\\') = '\0'; /* remove .exe file name */
+    if ((cp = strrchr(buf, '\\')) == 0) {
+	/* This happens if the application is in a drive root, and
+	 * there is no bin directory. */
+	buf[0] = '\0';
+	return JNI_FALSE;
+    }
+	if(strcmp(cp, "\\bin") == 0)
+		*cp = '\0';  /* remove the bin\ part */
+	// else c:\foo\something\javac
+    return JNI_TRUE;
+}
+
+/*
+ * Helpers to look in the registry for a public JRE.
+ */
+                    /* Same for 1.5.0, 1.5.1, 1.5.2 etc. */
+#define DOTRELEASE  JDK_MAJOR_VERSION "." JDK_MINOR_VERSION
+#define JRE_KEY	    "Software\\JavaSoft\\Java Runtime Environment"
+
+static jboolean
+GetStringFromRegistry(HKEY key, const char *name, char *buf, jint bufsize)
+{
+    DWORD type, size;
+
+    if (RegQueryValueEx(key, name, 0, &type, 0, &size) == 0
+	&& type == REG_SZ
+	&& (size < (unsigned int)bufsize)) {
+	if (RegQueryValueEx(key, name, 0, 0, buf, &size) == 0) {
+	    return JNI_TRUE;
+	}
+    }
+    return JNI_FALSE;
+}
+
+static BOOL versionOk(char *version)
+{
+	char *major;
+	int major_version;
+	int minor_version;
+	char *minor_start;
+	// 1. find the .
+	minor_start = strstr(version,".");
+	if (minor_start == NULL) // no . found.
+		return FALSE;
+	
+	major = (char *)malloc(minor_start - version + 1);
+	strncpy(major,version,minor_start - version);
+	major[minor_start - version]='\0';
+	major_version = atoi(major);
+	free(major);
+
+	if (minor_start[1] == '\0') // "x." ?
+		return FALSE;
+
+	// anything less than 1.6 is not supported
+	minor_version = atoi(++minor_start);
+	if (major_version <1 || (major_version < 2 && minor_version < 6))
+		return FALSE;
+
+	return TRUE;
+}
+
+static jboolean
+GetPublicJREHome(char *buf, jint bufsize)
+{
+    HKEY key, subkey;
+    char version[MAXPATHLEN];
+
+    /* Find the current version of the JRE */
+    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, JRE_KEY, 0, KEY_READ, &key) != 0) {
+	fprintf(stderr, "Error opening registry key '" JRE_KEY "'\n");
+	return JNI_FALSE;
+    }
+
+    if (!GetStringFromRegistry(key, "CurrentVersion",
+			       version, sizeof(version))) {
+	fprintf(stderr, "Failed reading value of registry key:\n\t"
+		JRE_KEY "\\CurrentVersion\n");
+	RegCloseKey(key);
+	return JNI_FALSE;
+    }
+
+    /* Check if the version is good */
+	if (!versionOk(version))
+	{
+		RegCloseKey(key);
+		return JNI_FALSE;
+	}
+
+    /* Find directory where the current version is installed. */
+    if (RegOpenKeyEx(key, version, 0, KEY_READ, &subkey) != 0) {
+	fprintf(stderr, "Error opening registry key '"
+		JRE_KEY "\\%s'\n", version);
+	RegCloseKey(key);
+	return JNI_FALSE;
+    }
+
+    if (!GetStringFromRegistry(subkey, "JavaHome", buf, bufsize)) {
+	fprintf(stderr, "Failed reading value of registry key:\n\t"
+		JRE_KEY "\\%s\\JavaHome\n", version);
+	RegCloseKey(key);
+	RegCloseKey(subkey);
+	return JNI_FALSE;
+    }
+
+    RegCloseKey(key);
+    RegCloseKey(subkey);
+    return JNI_TRUE;
+}
+
+
+void ReportErrorMessage(char * message, jboolean always) {
+  if (message != NULL) {
+   // MessageBox(NULL, message, "Java Virtual Machine Launcher",
+	//       (MB_OK|MB_ICONSTOP|MB_APPLMODAL)); 
+  }
+}
+
+void ReportErrorMessage2(char * format, char * string, jboolean always) { 
+  /*
+   * The format argument must be a printf format string with one %s
+   * argument, which is passed the string argument.
+   */
+  size_t size;
+  char * message;
+  size = strlen(format) + strlen(string);
+  message = (char*)MemAlloc(size*sizeof(char));
+  sprintf(message, (const char *)format, string);
+  
+  if (message != NULL) {
+   // MessageBox(NULL, message, "Java Virtual Machine Launcher",
+	//       (MB_OK|MB_ICONSTOP|MB_APPLMODAL)); 
+  }
+}
+
+void  ReportExceptionDescription(JNIEnv * env) {
+  /*
+   * This code should be replaced by code which opens a window with
+   * the exception detail message.
+   */
+  (*env)->ExceptionDescribe(env);
+}
+
+
+/*
+ * Return JNI_TRUE for an option string that has no effect but should
+ * _not_ be passed on to the vm; return JNI_FALSE otherwise. On
+ * windows, there are no options that should be screened in this
+ * manner.
+ */
+jboolean RemovableMachineDependentOption(char * option) {
+  return JNI_FALSE;
+}
+
+void PrintMachineDependentOptions() {
+  return;
+}
+
+jboolean
+ServerClassMachine() {
+  jboolean result = JNI_FALSE;
+  return result;
+}
+
+
+/*
+ * Wrapper for platform dependent unsetenv function.
+ */
+int
+UnsetEnv(char *name)
+{
+    int ret;
+    char *buf = MemAlloc(strlen(name) + 2);
+    buf = strcat(strcpy(buf, name), "=");
+    ret = _putenv(buf);
+    free(buf);
+    return (ret);
+}
+
+/*
+ * The following just map the common UNIX name to the Windows API name,
+ * so that the common UNIX name can be used in shared code.
+ */
+int
+strcasecmp(const char *s1, const char *s2)
+{
+    return (stricmp(s1, s2));
+}
+
+int
+strncasecmp(const char *s1, const char *s2, size_t n)
+{
+    return (strnicmp(s1, s2, n));
+}
diff --git a/installer/c/limewireExe/java_md.h b/installer/c/limewireExe/java_md.h
new file mode 100644
index 0000000000..0cb4d8f0c1
--- /dev/null
+++ b/installer/c/limewireExe/java_md.h
@@ -0,0 +1,28 @@
+/*
+ * @(#)java_md.h	1.10 04/04/24
+ *
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+/* Backported from Tiger (1.5) java_md.h	1.13 04/01/12 */
+
+#ifndef JAVA_MD_H
+#define JAVA_MD_H
+
+#include "jni.h"
+#include <windows.h>
+#include <io.h>
+
+#define PATH_SEPARATOR	';'
+#define FILESEP		"\\"
+#define FILE_SEPARATOR	'\\'
+#define MAXPATHLEN      MAX_PATH
+#define MAXNAMELEN	MAX_PATH
+
+
+int UnsetEnv(char *name);
+int strcasecmp(const char *s1, const char *s2);
+int strncasecmp(const char *s1, const char *s2, size_t n);
+
+#endif
diff --git a/installer/c/limewireExe/jni.h b/installer/c/limewireExe/jni.h
new file mode 100644
index 0000000000..f53476c096
--- /dev/null
+++ b/installer/c/limewireExe/jni.h
@@ -0,0 +1,1944 @@
+/*
+ * @(#)jni.h	1.62 06/02/02
+ *
+ * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL.  Use is subject to license terms.
+ */
+
+/*
+ * We used part of Netscape's Java Runtime Interface (JRI) as the starting
+ * point of our design and implementation.
+ */
+
+/******************************************************************************
+ * Java Runtime Interface
+ * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved.
+ *****************************************************************************/
+
+#ifndef _JAVASOFT_JNI_H_
+#define _JAVASOFT_JNI_H_
+
+#include <stdio.h>
+#include <stdarg.h>
+
+/* jni_md.h contains the machine-dependent typedefs for jbyte, jint
+   and jlong */
+
+#include "jni_md.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * JNI Types
+ */
+
+#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H
+
+typedef unsigned char	jboolean;
+typedef unsigned short	jchar;
+typedef short		jshort;
+typedef float		jfloat;
+typedef double		jdouble;
+
+typedef jint            jsize;
+
+#ifdef __cplusplus
+
+class _jobject {};
+class _jclass : public _jobject {};
+class _jthrowable : public _jobject {};
+class _jstring : public _jobject {};
+class _jarray : public _jobject {};
+class _jbooleanArray : public _jarray {};
+class _jbyteArray : public _jarray {};
+class _jcharArray : public _jarray {};
+class _jshortArray : public _jarray {};
+class _jintArray : public _jarray {};
+class _jlongArray : public _jarray {};
+class _jfloatArray : public _jarray {};
+class _jdoubleArray : public _jarray {};
+class _jobjectArray : public _jarray {};
+
+typedef _jobject *jobject;
+typedef _jclass *jclass;
+typedef _jthrowable *jthrowable;
+typedef _jstring *jstring;
+typedef _jarray *jarray;
+typedef _jbooleanArray *jbooleanArray;
+typedef _jbyteArray *jbyteArray;
+typedef _jcharArray *jcharArray;
+typedef _jshortArray *jshortArray;
+typedef _jintArray *jintArray;
+typedef _jlongArray *jlongArray;
+typedef _jfloatArray *jfloatArray;
+typedef _jdoubleArray *jdoubleArray;
+typedef _jobjectArray *jobjectArray;
+
+#else
+
+struct _jobject;
+
+typedef struct _jobject *jobject;
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+#endif
+
+typedef jobject jweak;
+
+typedef union jvalue {
+    jboolean z;
+    jbyte    b;
+    jchar    c;
+    jshort   s;
+    jint     i;
+    jlong    j;
+    jfloat   f;
+    jdouble  d;
+    jobject  l;
+} jvalue;
+
+struct _jfieldID;
+typedef struct _jfieldID *jfieldID;
+
+struct _jmethodID;
+typedef struct _jmethodID *jmethodID;
+
+/* Return values from jobjectRefType */
+typedef enum _jobjectType {
+     JNIInvalidRefType    = 0,
+     JNILocalRefType      = 1,
+     JNIGlobalRefType     = 2,
+     JNIWeakGlobalRefType = 3 
+} jobjectRefType;
+
+
+#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */
+
+/*
+ * jboolean constants
+ */
+
+#define JNI_FALSE 0
+#define JNI_TRUE 1
+
+/*
+ * possible return values for JNI functions.
+ */
+
+#define JNI_OK           0                 /* success */
+#define JNI_ERR          (-1)              /* unknown error */
+#define JNI_EDETACHED    (-2)              /* thread detached from the VM */
+#define JNI_EVERSION     (-3)              /* JNI version error */
+#define JNI_ENOMEM       (-4)              /* not enough memory */
+#define JNI_EEXIST       (-5)              /* VM already created */
+#define JNI_EINVAL       (-6)              /* invalid arguments */
+
+/*
+ * used in ReleaseScalarArrayElements
+ */
+
+#define JNI_COMMIT 1
+#define JNI_ABORT 2
+
+/*
+ * used in RegisterNatives to describe native method name, signature,
+ * and function pointer.
+ */
+
+typedef struct {
+    char *name;
+    char *signature;
+    void *fnPtr;
+} JNINativeMethod;
+
+/*
+ * JNI Native Method Interface.
+ */
+
+struct JNINativeInterface_;
+
+struct JNIEnv_;
+
+#ifdef __cplusplus
+typedef JNIEnv_ JNIEnv;
+#else
+typedef const struct JNINativeInterface_ *JNIEnv;
+#endif
+
+/*
+ * JNI Invocation Interface.
+ */
+
+struct JNIInvokeInterface_;
+
+struct JavaVM_;
+
+#ifdef __cplusplus
+typedef JavaVM_ JavaVM;
+#else
+typedef const struct JNIInvokeInterface_ *JavaVM;
+#endif
+
+struct JNINativeInterface_ {
+    void *reserved0;
+    void *reserved1;
+    void *reserved2;
+
+    void *reserved3;
+    jint (JNICALL *GetVersion)(JNIEnv *env);
+
+    jclass (JNICALL *DefineClass)
+      (JNIEnv *env, const char *name, jobject loader, const jbyte *buf,
+       jsize len);
+    jclass (JNICALL *FindClass)
+      (JNIEnv *env, const char *name);
+
+    jmethodID (JNICALL *FromReflectedMethod)
+      (JNIEnv *env, jobject method);
+    jfieldID (JNICALL *FromReflectedField)
+      (JNIEnv *env, jobject field);
+
+    jobject (JNICALL *ToReflectedMethod)
+      (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);
+
+    jclass (JNICALL *GetSuperclass)
+      (JNIEnv *env, jclass sub);
+    jboolean (JNICALL *IsAssignableFrom)
+      (JNIEnv *env, jclass sub, jclass sup);
+
+    jobject (JNICALL *ToReflectedField)
+      (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);
+
+    jint (JNICALL *Throw)
+      (JNIEnv *env, jthrowable obj);
+    jint (JNICALL *ThrowNew)
+      (JNIEnv *env, jclass clazz, const char *msg);
+    jthrowable (JNICALL *ExceptionOccurred)
+      (JNIEnv *env);
+    void (JNICALL *ExceptionDescribe)
+      (JNIEnv *env);
+    void (JNICALL *ExceptionClear)
+      (JNIEnv *env);
+    void (JNICALL *FatalError)
+      (JNIEnv *env, const char *msg);
+
+    jint (JNICALL *PushLocalFrame)
+      (JNIEnv *env, jint capacity);
+    jobject (JNICALL *PopLocalFrame)
+      (JNIEnv *env, jobject result);
+
+    jobject (JNICALL *NewGlobalRef)
+      (JNIEnv *env, jobject lobj);
+    void (JNICALL *DeleteGlobalRef)
+      (JNIEnv *env, jobject gref);
+    void (JNICALL *DeleteLocalRef)
+      (JNIEnv *env, jobject obj);
+    jboolean (JNICALL *IsSameObject)
+      (JNIEnv *env, jobject obj1, jobject obj2);
+    jobject (JNICALL *NewLocalRef)
+      (JNIEnv *env, jobject ref);
+    jint (JNICALL *EnsureLocalCapacity)
+      (JNIEnv *env, jint capacity);
+
+    jobject (JNICALL *AllocObject)
+      (JNIEnv *env, jclass clazz);
+    jobject (JNICALL *NewObject)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jobject (JNICALL *NewObjectV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jobject (JNICALL *NewObjectA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jclass (JNICALL *GetObjectClass)
+      (JNIEnv *env, jobject obj);
+    jboolean (JNICALL *IsInstanceOf)
+      (JNIEnv *env, jobject obj, jclass clazz);
+
+    jmethodID (JNICALL *GetMethodID)
+      (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+
+    jobject (JNICALL *CallObjectMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jobject (JNICALL *CallObjectMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jobject (JNICALL *CallObjectMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
+
+    jboolean (JNICALL *CallBooleanMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jboolean (JNICALL *CallBooleanMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jboolean (JNICALL *CallBooleanMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
+
+    jbyte (JNICALL *CallByteMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jbyte (JNICALL *CallByteMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jbyte (JNICALL *CallByteMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+    jchar (JNICALL *CallCharMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jchar (JNICALL *CallCharMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jchar (JNICALL *CallCharMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+    jshort (JNICALL *CallShortMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jshort (JNICALL *CallShortMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jshort (JNICALL *CallShortMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+    jint (JNICALL *CallIntMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jint (JNICALL *CallIntMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jint (JNICALL *CallIntMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+    jlong (JNICALL *CallLongMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jlong (JNICALL *CallLongMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jlong (JNICALL *CallLongMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+    jfloat (JNICALL *CallFloatMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jfloat (JNICALL *CallFloatMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jfloat (JNICALL *CallFloatMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+    jdouble (JNICALL *CallDoubleMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    jdouble (JNICALL *CallDoubleMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    jdouble (JNICALL *CallDoubleMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+    void (JNICALL *CallVoidMethod)
+      (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+    void (JNICALL *CallVoidMethodV)
+      (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+    void (JNICALL *CallVoidMethodA)
+      (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
+
+    jobject (JNICALL *CallNonvirtualObjectMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jobject (JNICALL *CallNonvirtualObjectMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jobject (JNICALL *CallNonvirtualObjectMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue * args);
+
+    jboolean (JNICALL *CallNonvirtualBooleanMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jboolean (JNICALL *CallNonvirtualBooleanMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jboolean (JNICALL *CallNonvirtualBooleanMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue * args);
+
+    jbyte (JNICALL *CallNonvirtualByteMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jbyte (JNICALL *CallNonvirtualByteMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jbyte (JNICALL *CallNonvirtualByteMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue *args);
+
+    jchar (JNICALL *CallNonvirtualCharMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jchar (JNICALL *CallNonvirtualCharMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jchar (JNICALL *CallNonvirtualCharMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue *args);
+
+    jshort (JNICALL *CallNonvirtualShortMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jshort (JNICALL *CallNonvirtualShortMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jshort (JNICALL *CallNonvirtualShortMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue *args);
+
+    jint (JNICALL *CallNonvirtualIntMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jint (JNICALL *CallNonvirtualIntMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jint (JNICALL *CallNonvirtualIntMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue *args);
+
+    jlong (JNICALL *CallNonvirtualLongMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jlong (JNICALL *CallNonvirtualLongMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jlong (JNICALL *CallNonvirtualLongMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue *args);
+
+    jfloat (JNICALL *CallNonvirtualFloatMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jfloat (JNICALL *CallNonvirtualFloatMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jfloat (JNICALL *CallNonvirtualFloatMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue *args);
+
+    jdouble (JNICALL *CallNonvirtualDoubleMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    jdouble (JNICALL *CallNonvirtualDoubleMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    jdouble (JNICALL *CallNonvirtualDoubleMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue *args);
+
+    void (JNICALL *CallNonvirtualVoidMethod)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+    void (JNICALL *CallNonvirtualVoidMethodV)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       va_list args);
+    void (JNICALL *CallNonvirtualVoidMethodA)
+      (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+       const jvalue * args);
+
+    jfieldID (JNICALL *GetFieldID)
+      (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+
+    jobject (JNICALL *GetObjectField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jboolean (JNICALL *GetBooleanField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jbyte (JNICALL *GetByteField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jchar (JNICALL *GetCharField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jshort (JNICALL *GetShortField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jint (JNICALL *GetIntField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jlong (JNICALL *GetLongField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jfloat (JNICALL *GetFloatField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+    jdouble (JNICALL *GetDoubleField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID);
+
+    void (JNICALL *SetObjectField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
+    void (JNICALL *SetBooleanField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
+    void (JNICALL *SetByteField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
+    void (JNICALL *SetCharField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
+    void (JNICALL *SetShortField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
+    void (JNICALL *SetIntField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
+    void (JNICALL *SetLongField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
+    void (JNICALL *SetFloatField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
+    void (JNICALL *SetDoubleField)
+      (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
+
+    jmethodID (JNICALL *GetStaticMethodID)
+      (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+
+    jobject (JNICALL *CallStaticObjectMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jobject (JNICALL *CallStaticObjectMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jobject (JNICALL *CallStaticObjectMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jboolean (JNICALL *CallStaticBooleanMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jboolean (JNICALL *CallStaticBooleanMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jboolean (JNICALL *CallStaticBooleanMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jbyte (JNICALL *CallStaticByteMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jbyte (JNICALL *CallStaticByteMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jbyte (JNICALL *CallStaticByteMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jchar (JNICALL *CallStaticCharMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jchar (JNICALL *CallStaticCharMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jchar (JNICALL *CallStaticCharMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jshort (JNICALL *CallStaticShortMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jshort (JNICALL *CallStaticShortMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jshort (JNICALL *CallStaticShortMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jint (JNICALL *CallStaticIntMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jint (JNICALL *CallStaticIntMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jint (JNICALL *CallStaticIntMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jlong (JNICALL *CallStaticLongMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jlong (JNICALL *CallStaticLongMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jlong (JNICALL *CallStaticLongMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jfloat (JNICALL *CallStaticFloatMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jfloat (JNICALL *CallStaticFloatMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jfloat (JNICALL *CallStaticFloatMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    jdouble (JNICALL *CallStaticDoubleMethod)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+    jdouble (JNICALL *CallStaticDoubleMethodV)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+    jdouble (JNICALL *CallStaticDoubleMethodA)
+      (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+    void (JNICALL *CallStaticVoidMethod)
+      (JNIEnv *env, jclass cls, jmethodID methodID, ...);
+    void (JNICALL *CallStaticVoidMethodV)
+      (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);
+    void (JNICALL *CallStaticVoidMethodA)
+      (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args);
+
+    jfieldID (JNICALL *GetStaticFieldID)
+      (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+    jobject (JNICALL *GetStaticObjectField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jboolean (JNICALL *GetStaticBooleanField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jbyte (JNICALL *GetStaticByteField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jchar (JNICALL *GetStaticCharField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jshort (JNICALL *GetStaticShortField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jint (JNICALL *GetStaticIntField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jlong (JNICALL *GetStaticLongField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jfloat (JNICALL *GetStaticFloatField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+    jdouble (JNICALL *GetStaticDoubleField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID);
+
+    void (JNICALL *SetStaticObjectField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
+    void (JNICALL *SetStaticBooleanField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
+    void (JNICALL *SetStaticByteField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
+    void (JNICALL *SetStaticCharField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
+    void (JNICALL *SetStaticShortField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
+    void (JNICALL *SetStaticIntField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
+    void (JNICALL *SetStaticLongField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
+    void (JNICALL *SetStaticFloatField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
+    void (JNICALL *SetStaticDoubleField)
+      (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
+
+    jstring (JNICALL *NewString)
+      (JNIEnv *env, const jchar *unicode, jsize len);
+    jsize (JNICALL *GetStringLength)
+      (JNIEnv *env, jstring str);
+    const jchar *(JNICALL *GetStringChars)
+      (JNIEnv *env, jstring str, jboolean *isCopy);
+    void (JNICALL *ReleaseStringChars)
+      (JNIEnv *env, jstring str, const jchar *chars);
+
+    jstring (JNICALL *NewStringUTF)
+      (JNIEnv *env, const char *utf);
+    jsize (JNICALL *GetStringUTFLength)
+      (JNIEnv *env, jstring str);
+    const char* (JNICALL *GetStringUTFChars)
+      (JNIEnv *env, jstring str, jboolean *isCopy);
+    void (JNICALL *ReleaseStringUTFChars)
+      (JNIEnv *env, jstring str, const char* chars);
+
+
+    jsize (JNICALL *GetArrayLength)
+      (JNIEnv *env, jarray array);
+
+    jobjectArray (JNICALL *NewObjectArray)
+      (JNIEnv *env, jsize len, jclass clazz, jobject init);
+    jobject (JNICALL *GetObjectArrayElement)
+      (JNIEnv *env, jobjectArray array, jsize index);
+    void (JNICALL *SetObjectArrayElement)
+      (JNIEnv *env, jobjectArray array, jsize index, jobject val);
+
+    jbooleanArray (JNICALL *NewBooleanArray)
+      (JNIEnv *env, jsize len);
+    jbyteArray (JNICALL *NewByteArray)
+      (JNIEnv *env, jsize len);
+    jcharArray (JNICALL *NewCharArray)
+      (JNIEnv *env, jsize len);
+    jshortArray (JNICALL *NewShortArray)
+      (JNIEnv *env, jsize len);
+    jintArray (JNICALL *NewIntArray)
+      (JNIEnv *env, jsize len);
+    jlongArray (JNICALL *NewLongArray)
+      (JNIEnv *env, jsize len);
+    jfloatArray (JNICALL *NewFloatArray)
+      (JNIEnv *env, jsize len);
+    jdoubleArray (JNICALL *NewDoubleArray)
+      (JNIEnv *env, jsize len);
+
+    jboolean * (JNICALL *GetBooleanArrayElements)
+      (JNIEnv *env, jbooleanArray array, jboolean *isCopy);
+    jbyte * (JNICALL *GetByteArrayElements)
+      (JNIEnv *env, jbyteArray array, jboolean *isCopy);
+    jchar * (JNICALL *GetCharArrayElements)
+      (JNIEnv *env, jcharArray array, jboolean *isCopy);
+    jshort * (JNICALL *GetShortArrayElements)
+      (JNIEnv *env, jshortArray array, jboolean *isCopy);
+    jint * (JNICALL *GetIntArrayElements)
+      (JNIEnv *env, jintArray array, jboolean *isCopy);
+    jlong * (JNICALL *GetLongArrayElements)
+      (JNIEnv *env, jlongArray array, jboolean *isCopy);
+    jfloat * (JNICALL *GetFloatArrayElements)
+      (JNIEnv *env, jfloatArray array, jboolean *isCopy);
+    jdouble * (JNICALL *GetDoubleArrayElements)
+      (JNIEnv *env, jdoubleArray array, jboolean *isCopy);
+
+    void (JNICALL *ReleaseBooleanArrayElements)
+      (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
+    void (JNICALL *ReleaseByteArrayElements)
+      (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
+    void (JNICALL *ReleaseCharArrayElements)
+      (JNIEnv *env, jcharArray array, jchar *elems, jint mode);
+    void (JNICALL *ReleaseShortArrayElements)
+      (JNIEnv *env, jshortArray array, jshort *elems, jint mode);
+    void (JNICALL *ReleaseIntArrayElements)
+      (JNIEnv *env, jintArray array, jint *elems, jint mode);
+    void (JNICALL *ReleaseLongArrayElements)
+      (JNIEnv *env, jlongArray array, jlong *elems, jint mode);
+    void (JNICALL *ReleaseFloatArrayElements)
+      (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
+    void (JNICALL *ReleaseDoubleArrayElements)
+      (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
+
+    void (JNICALL *GetBooleanArrayRegion)
+      (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
+    void (JNICALL *GetByteArrayRegion)
+      (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
+    void (JNICALL *GetCharArrayRegion)
+      (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
+    void (JNICALL *GetShortArrayRegion)
+      (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
+    void (JNICALL *GetIntArrayRegion)
+      (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
+    void (JNICALL *GetLongArrayRegion)
+      (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
+    void (JNICALL *GetFloatArrayRegion)
+      (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
+    void (JNICALL *GetDoubleArrayRegion)
+      (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
+
+    void (JNICALL *SetBooleanArrayRegion)
+      (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf);
+    void (JNICALL *SetByteArrayRegion)
+      (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf);
+    void (JNICALL *SetCharArrayRegion)
+      (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf);
+    void (JNICALL *SetShortArrayRegion)
+      (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf);
+    void (JNICALL *SetIntArrayRegion)
+      (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);
+    void (JNICALL *SetLongArrayRegion)
+      (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf);
+    void (JNICALL *SetFloatArrayRegion)
+      (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf);
+    void (JNICALL *SetDoubleArrayRegion)
+      (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf);
+
+    jint (JNICALL *RegisterNatives)
+      (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
+       jint nMethods);
+    jint (JNICALL *UnregisterNatives)
+      (JNIEnv *env, jclass clazz);
+
+    jint (JNICALL *MonitorEnter)
+      (JNIEnv *env, jobject obj);
+    jint (JNICALL *MonitorExit)
+      (JNIEnv *env, jobject obj);
+
+    jint (JNICALL *GetJavaVM)
+      (JNIEnv *env, JavaVM **vm);
+
+    void (JNICALL *GetStringRegion)
+      (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
+    void (JNICALL *GetStringUTFRegion)
+      (JNIEnv *env, jstring str, jsize start, jsize len, char *buf);
+
+    void * (JNICALL *GetPrimitiveArrayCritical)
+      (JNIEnv *env, jarray array, jboolean *isCopy);
+    void (JNICALL *ReleasePrimitiveArrayCritical)
+      (JNIEnv *env, jarray array, void *carray, jint mode);
+
+    const jchar * (JNICALL *GetStringCritical)
+      (JNIEnv *env, jstring string, jboolean *isCopy);
+    void (JNICALL *ReleaseStringCritical)
+      (JNIEnv *env, jstring string, const jchar *cstring);
+
+    jweak (JNICALL *NewWeakGlobalRef)
+       (JNIEnv *env, jobject obj);
+    void (JNICALL *DeleteWeakGlobalRef)
+       (JNIEnv *env, jweak ref);
+
+    jboolean (JNICALL *ExceptionCheck)
+       (JNIEnv *env);
+
+    jobject (JNICALL *NewDirectByteBuffer)
+       (JNIEnv* env, void* address, jlong capacity);
+    void* (JNICALL *GetDirectBufferAddress)
+       (JNIEnv* env, jobject buf);
+    jlong (JNICALL *GetDirectBufferCapacity)
+       (JNIEnv* env, jobject buf);
+
+    /* New JNI 1.6 Features */
+
+    jobjectRefType (JNICALL *GetObjectRefType)
+        (JNIEnv* env, jobject obj);
+};
+
+/*
+ * We use inlined functions for C++ so that programmers can write:
+ *
+ *    env->FindClass("java/lang/String")
+ *
+ * in C++ rather than:
+ *
+ *    (*env)->FindClass(env, "java/lang/String")
+ *
+ * in C.
+ */
+
+struct JNIEnv_ {
+    const struct JNINativeInterface_ *functions;
+#ifdef __cplusplus
+
+    jint GetVersion() {
+        return functions->GetVersion(this);
+    }
+    jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
+		       jsize len) {
+        return functions->DefineClass(this, name, loader, buf, len);
+    }
+    jclass FindClass(const char *name) {
+        return functions->FindClass(this, name);
+    }
+    jmethodID FromReflectedMethod(jobject method) {
+        return functions->FromReflectedMethod(this,method);
+    }
+    jfieldID FromReflectedField(jobject field) {
+        return functions->FromReflectedField(this,field);
+    }
+
+    jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) {
+        return functions->ToReflectedMethod(this, cls, methodID, isStatic);
+    }
+
+    jclass GetSuperclass(jclass sub) {
+        return functions->GetSuperclass(this, sub);
+    }
+    jboolean IsAssignableFrom(jclass sub, jclass sup) {
+        return functions->IsAssignableFrom(this, sub, sup);
+    }
+
+    jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) {
+        return functions->ToReflectedField(this,cls,fieldID,isStatic);
+    }
+
+    jint Throw(jthrowable obj) {
+        return functions->Throw(this, obj);
+    }
+    jint ThrowNew(jclass clazz, const char *msg) {
+        return functions->ThrowNew(this, clazz, msg);
+    }
+    jthrowable ExceptionOccurred() {
+        return functions->ExceptionOccurred(this);
+    }
+    void ExceptionDescribe() {
+        functions->ExceptionDescribe(this);
+    }
+    void ExceptionClear() {
+        functions->ExceptionClear(this);
+    }
+    void FatalError(const char *msg) {
+        functions->FatalError(this, msg);
+    }
+
+    jint PushLocalFrame(jint capacity) {
+        return functions->PushLocalFrame(this,capacity);
+    }
+    jobject PopLocalFrame(jobject result) {
+        return functions->PopLocalFrame(this,result);
+    }
+
+    jobject NewGlobalRef(jobject lobj) {
+        return functions->NewGlobalRef(this,lobj);
+    }
+    void DeleteGlobalRef(jobject gref) {
+        functions->DeleteGlobalRef(this,gref);
+    }
+    void DeleteLocalRef(jobject obj) {
+        functions->DeleteLocalRef(this, obj);
+    }
+
+    jboolean IsSameObject(jobject obj1, jobject obj2) {
+        return functions->IsSameObject(this,obj1,obj2);
+    }
+
+    jobject NewLocalRef(jobject ref) {
+        return functions->NewLocalRef(this,ref);
+    }
+    jint EnsureLocalCapacity(jint capacity) {
+        return functions->EnsureLocalCapacity(this,capacity);
+    }
+
+    jobject AllocObject(jclass clazz) {
+        return functions->AllocObject(this,clazz);
+    }
+    jobject NewObject(jclass clazz, jmethodID methodID, ...) {
+        va_list args;
+	jobject result;
+	va_start(args, methodID);
+        result = functions->NewObjectV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jobject NewObjectV(jclass clazz, jmethodID methodID,
+		       va_list args) {
+        return functions->NewObjectV(this,clazz,methodID,args);
+    }
+    jobject NewObjectA(jclass clazz, jmethodID methodID,
+		       const jvalue *args) {
+        return functions->NewObjectA(this,clazz,methodID,args);
+    }
+
+    jclass GetObjectClass(jobject obj) {
+        return functions->GetObjectClass(this,obj);
+    }
+    jboolean IsInstanceOf(jobject obj, jclass clazz) {
+        return functions->IsInstanceOf(this,obj,clazz);
+    }
+
+    jmethodID GetMethodID(jclass clazz, const char *name,
+			  const char *sig) {
+        return functions->GetMethodID(this,clazz,name,sig);
+    }
+
+    jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jobject result;
+	va_start(args,methodID);
+	result = functions->CallObjectMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jobject CallObjectMethodV(jobject obj, jmethodID methodID,
+			va_list args) {
+        return functions->CallObjectMethodV(this,obj,methodID,args);
+    }
+    jobject CallObjectMethodA(jobject obj, jmethodID methodID,
+			const jvalue * args) {
+        return functions->CallObjectMethodA(this,obj,methodID,args);
+    }
+
+    jboolean CallBooleanMethod(jobject obj,
+			       jmethodID methodID, ...) {
+        va_list args;
+	jboolean result;
+	va_start(args,methodID);
+	result = functions->CallBooleanMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jboolean CallBooleanMethodV(jobject obj, jmethodID methodID,
+				va_list args) {
+        return functions->CallBooleanMethodV(this,obj,methodID,args);
+    }
+    jboolean CallBooleanMethodA(jobject obj, jmethodID methodID,
+				const jvalue * args) {
+        return functions->CallBooleanMethodA(this,obj,methodID, args);
+    }
+
+    jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jbyte result;
+	va_start(args,methodID);
+	result = functions->CallByteMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jbyte CallByteMethodV(jobject obj, jmethodID methodID,
+			  va_list args) {
+        return functions->CallByteMethodV(this,obj,methodID,args);
+    }
+    jbyte CallByteMethodA(jobject obj, jmethodID methodID,
+			  const jvalue * args) {
+        return functions->CallByteMethodA(this,obj,methodID,args);
+    }
+
+    jchar CallCharMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jchar result;
+	va_start(args,methodID);
+	result = functions->CallCharMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jchar CallCharMethodV(jobject obj, jmethodID methodID,
+			  va_list args) {
+        return functions->CallCharMethodV(this,obj,methodID,args);
+    }
+    jchar CallCharMethodA(jobject obj, jmethodID methodID,
+			  const jvalue * args) {
+        return functions->CallCharMethodA(this,obj,methodID,args);
+    }
+
+    jshort CallShortMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jshort result;
+	va_start(args,methodID);
+	result = functions->CallShortMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jshort CallShortMethodV(jobject obj, jmethodID methodID,
+			    va_list args) {
+        return functions->CallShortMethodV(this,obj,methodID,args);
+    }
+    jshort CallShortMethodA(jobject obj, jmethodID methodID,
+			    const jvalue * args) {
+        return functions->CallShortMethodA(this,obj,methodID,args);
+    }
+
+    jint CallIntMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jint result;
+	va_start(args,methodID);
+	result = functions->CallIntMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jint CallIntMethodV(jobject obj, jmethodID methodID,
+			va_list args) {
+        return functions->CallIntMethodV(this,obj,methodID,args);
+    }
+    jint CallIntMethodA(jobject obj, jmethodID methodID,
+			const jvalue * args) {
+        return functions->CallIntMethodA(this,obj,methodID,args);
+    }
+
+    jlong CallLongMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jlong result;
+	va_start(args,methodID);
+	result = functions->CallLongMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jlong CallLongMethodV(jobject obj, jmethodID methodID,
+			  va_list args) {
+        return functions->CallLongMethodV(this,obj,methodID,args);
+    }
+    jlong CallLongMethodA(jobject obj, jmethodID methodID,
+			  const jvalue * args) {
+        return functions->CallLongMethodA(this,obj,methodID,args);
+    }
+
+    jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jfloat result;
+	va_start(args,methodID);
+	result = functions->CallFloatMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jfloat CallFloatMethodV(jobject obj, jmethodID methodID,
+			    va_list args) {
+        return functions->CallFloatMethodV(this,obj,methodID,args);
+    }
+    jfloat CallFloatMethodA(jobject obj, jmethodID methodID,
+			    const jvalue * args) {
+        return functions->CallFloatMethodA(this,obj,methodID,args);
+    }
+
+    jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	jdouble result;
+	va_start(args,methodID);
+	result = functions->CallDoubleMethodV(this,obj,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jdouble CallDoubleMethodV(jobject obj, jmethodID methodID,
+			va_list args) {
+        return functions->CallDoubleMethodV(this,obj,methodID,args);
+    }
+    jdouble CallDoubleMethodA(jobject obj, jmethodID methodID,
+			const jvalue * args) {
+        return functions->CallDoubleMethodA(this,obj,methodID,args);
+    }
+
+    void CallVoidMethod(jobject obj, jmethodID methodID, ...) {
+        va_list args;
+	va_start(args,methodID);
+	functions->CallVoidMethodV(this,obj,methodID,args);
+	va_end(args);
+    }
+    void CallVoidMethodV(jobject obj, jmethodID methodID,
+			 va_list args) {
+        functions->CallVoidMethodV(this,obj,methodID,args);
+    }
+    void CallVoidMethodA(jobject obj, jmethodID methodID,
+			 const jvalue * args) {
+        functions->CallVoidMethodA(this,obj,methodID,args);
+    }
+
+    jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz,
+				       jmethodID methodID, ...) {
+        va_list args;
+	jobject result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualObjectMethodV(this,obj,clazz,
+							methodID,args);
+	va_end(args);
+	return result;
+    }
+    jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz,
+					jmethodID methodID, va_list args) {
+        return functions->CallNonvirtualObjectMethodV(this,obj,clazz,
+						      methodID,args);
+    }
+    jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz,
+					jmethodID methodID, const jvalue * args) {
+        return functions->CallNonvirtualObjectMethodA(this,obj,clazz,
+						      methodID,args);
+    }
+
+    jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz,
+					 jmethodID methodID, ...) {
+        va_list args;
+	jboolean result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
+							 methodID,args);
+	va_end(args);
+	return result;
+    }
+    jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz,
+					  jmethodID methodID, va_list args) {
+        return functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
+						       methodID,args);
+    }
+    jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz,
+					  jmethodID methodID, const jvalue * args) {
+        return functions->CallNonvirtualBooleanMethodA(this,obj,clazz,
+						       methodID, args);
+    }
+
+    jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz,
+				   jmethodID methodID, ...) {
+        va_list args;
+	jbyte result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualByteMethodV(this,obj,clazz,
+						      methodID,args);
+	va_end(args);
+	return result;
+    }
+    jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz,
+				    jmethodID methodID, va_list args) {
+        return functions->CallNonvirtualByteMethodV(this,obj,clazz,
+						    methodID,args);
+    }
+    jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz,
+				    jmethodID methodID, const jvalue * args) {
+        return functions->CallNonvirtualByteMethodA(this,obj,clazz,
+						    methodID,args);
+    }
+
+    jchar CallNonvirtualCharMethod(jobject obj, jclass clazz,
+				   jmethodID methodID, ...) {
+        va_list args;
+	jchar result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualCharMethodV(this,obj,clazz,
+						      methodID,args);
+	va_end(args);
+	return result;
+    }
+    jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz,
+				    jmethodID methodID, va_list args) {
+        return functions->CallNonvirtualCharMethodV(this,obj,clazz,
+						    methodID,args);
+    }
+    jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz,
+				    jmethodID methodID, const jvalue * args) {
+        return functions->CallNonvirtualCharMethodA(this,obj,clazz,
+						    methodID,args);
+    }
+
+    jshort CallNonvirtualShortMethod(jobject obj, jclass clazz,
+				     jmethodID methodID, ...) {
+        va_list args;
+	jshort result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualShortMethodV(this,obj,clazz,
+						       methodID,args);
+	va_end(args);
+	return result;
+    }
+    jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz,
+				      jmethodID methodID, va_list args) {
+        return functions->CallNonvirtualShortMethodV(this,obj,clazz,
+						     methodID,args);
+    }
+    jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz,
+				      jmethodID methodID, const jvalue * args) {
+        return functions->CallNonvirtualShortMethodA(this,obj,clazz,
+						     methodID,args);
+    }
+
+    jint CallNonvirtualIntMethod(jobject obj, jclass clazz,
+				 jmethodID methodID, ...) {
+        va_list args;
+	jint result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualIntMethodV(this,obj,clazz,
+						     methodID,args);
+	va_end(args);
+	return result;
+    }
+    jint CallNonvirtualIntMethodV(jobject obj, jclass clazz,
+				  jmethodID methodID, va_list args) {
+        return functions->CallNonvirtualIntMethodV(this,obj,clazz,
+						   methodID,args);
+    }
+    jint CallNonvirtualIntMethodA(jobject obj, jclass clazz,
+				  jmethodID methodID, const jvalue * args) {
+        return functions->CallNonvirtualIntMethodA(this,obj,clazz,
+						   methodID,args);
+    }
+
+    jlong CallNonvirtualLongMethod(jobject obj, jclass clazz,
+				   jmethodID methodID, ...) {
+        va_list args;
+	jlong result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualLongMethodV(this,obj,clazz,
+						      methodID,args);
+	va_end(args);
+	return result;
+    }
+    jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz,
+				    jmethodID methodID, va_list args) {
+        return functions->CallNonvirtualLongMethodV(this,obj,clazz,
+						    methodID,args);
+    }
+    jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz,
+				    jmethodID methodID, const jvalue * args) {
+        return functions->CallNonvirtualLongMethodA(this,obj,clazz,
+						    methodID,args);
+    }
+
+    jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz,
+				     jmethodID methodID, ...) {
+        va_list args;
+	jfloat result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualFloatMethodV(this,obj,clazz,
+						       methodID,args);
+	va_end(args);
+	return result;
+    }
+    jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz,
+				      jmethodID methodID,
+				      va_list args) {
+        return functions->CallNonvirtualFloatMethodV(this,obj,clazz,
+						     methodID,args);
+    }
+    jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz,
+				      jmethodID methodID,
+				      const jvalue * args) {
+        return functions->CallNonvirtualFloatMethodA(this,obj,clazz,
+						     methodID,args);
+    }
+
+    jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz,
+				       jmethodID methodID, ...) {
+        va_list args;
+	jdouble result;
+	va_start(args,methodID);
+	result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
+							methodID,args);
+	va_end(args);
+	return result;
+    }
+    jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz,
+					jmethodID methodID,
+					va_list args) {
+        return functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
+						      methodID,args);
+    }
+    jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz,
+					jmethodID methodID,
+					const jvalue * args) {
+        return functions->CallNonvirtualDoubleMethodA(this,obj,clazz,
+						      methodID,args);
+    }
+
+    void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
+				  jmethodID methodID, ...) {
+        va_list args;
+	va_start(args,methodID);
+	functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
+	va_end(args);
+    }
+    void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
+				   jmethodID methodID,
+				   va_list args) {
+        functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
+    }
+    void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
+				   jmethodID methodID,
+				   const jvalue * args) {
+        functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args);
+    }
+
+    jfieldID GetFieldID(jclass clazz, const char *name,
+			const char *sig) {
+        return functions->GetFieldID(this,clazz,name,sig);
+    }
+
+    jobject GetObjectField(jobject obj, jfieldID fieldID) {
+        return functions->GetObjectField(this,obj,fieldID);
+    }
+    jboolean GetBooleanField(jobject obj, jfieldID fieldID) {
+        return functions->GetBooleanField(this,obj,fieldID);
+    }
+    jbyte GetByteField(jobject obj, jfieldID fieldID) {
+        return functions->GetByteField(this,obj,fieldID);
+    }
+    jchar GetCharField(jobject obj, jfieldID fieldID) {
+        return functions->GetCharField(this,obj,fieldID);
+    }
+    jshort GetShortField(jobject obj, jfieldID fieldID) {
+        return functions->GetShortField(this,obj,fieldID);
+    }
+    jint GetIntField(jobject obj, jfieldID fieldID) {
+        return functions->GetIntField(this,obj,fieldID);
+    }
+    jlong GetLongField(jobject obj, jfieldID fieldID) {
+        return functions->GetLongField(this,obj,fieldID);
+    }
+    jfloat GetFloatField(jobject obj, jfieldID fieldID) {
+        return functions->GetFloatField(this,obj,fieldID);
+    }
+    jdouble GetDoubleField(jobject obj, jfieldID fieldID) {
+        return functions->GetDoubleField(this,obj,fieldID);
+    }
+
+    void SetObjectField(jobject obj, jfieldID fieldID, jobject val) {
+        functions->SetObjectField(this,obj,fieldID,val);
+    }
+    void SetBooleanField(jobject obj, jfieldID fieldID,
+			 jboolean val) {
+        functions->SetBooleanField(this,obj,fieldID,val);
+    }
+    void SetByteField(jobject obj, jfieldID fieldID,
+		      jbyte val) {
+        functions->SetByteField(this,obj,fieldID,val);
+    }
+    void SetCharField(jobject obj, jfieldID fieldID,
+		      jchar val) {
+        functions->SetCharField(this,obj,fieldID,val);
+    }
+    void SetShortField(jobject obj, jfieldID fieldID,
+		       jshort val) {
+        functions->SetShortField(this,obj,fieldID,val);
+    }
+    void SetIntField(jobject obj, jfieldID fieldID,
+		     jint val) {
+        functions->SetIntField(this,obj,fieldID,val);
+    }
+    void SetLongField(jobject obj, jfieldID fieldID,
+		      jlong val) {
+        functions->SetLongField(this,obj,fieldID,val);
+    }
+    void SetFloatField(jobject obj, jfieldID fieldID,
+		       jfloat val) {
+        functions->SetFloatField(this,obj,fieldID,val);
+    }
+    void SetDoubleField(jobject obj, jfieldID fieldID,
+			jdouble val) {
+        functions->SetDoubleField(this,obj,fieldID,val);
+    }
+
+    jmethodID GetStaticMethodID(jclass clazz, const char *name,
+				const char *sig) {
+        return functions->GetStaticMethodID(this,clazz,name,sig);
+    }
+
+    jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID,
+			     ...) {
+        va_list args;
+	jobject result;
+	va_start(args,methodID);
+	result = functions->CallStaticObjectMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID,
+			      va_list args) {
+        return functions->CallStaticObjectMethodV(this,clazz,methodID,args);
+    }
+    jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID,
+			      const jvalue *args) {
+        return functions->CallStaticObjectMethodA(this,clazz,methodID,args);
+    }
+
+    jboolean CallStaticBooleanMethod(jclass clazz,
+				     jmethodID methodID, ...) {
+        va_list args;
+	jboolean result;
+	va_start(args,methodID);
+	result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jboolean CallStaticBooleanMethodV(jclass clazz,
+				      jmethodID methodID, va_list args) {
+        return functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
+    }
+    jboolean CallStaticBooleanMethodA(jclass clazz,
+				      jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticBooleanMethodA(this,clazz,methodID,args);
+    }
+
+    jbyte CallStaticByteMethod(jclass clazz,
+			       jmethodID methodID, ...) {
+        va_list args;
+	jbyte result;
+	va_start(args,methodID);
+	result = functions->CallStaticByteMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jbyte CallStaticByteMethodV(jclass clazz,
+				jmethodID methodID, va_list args) {
+        return functions->CallStaticByteMethodV(this,clazz,methodID,args);
+    }
+    jbyte CallStaticByteMethodA(jclass clazz,
+				jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticByteMethodA(this,clazz,methodID,args);
+    }
+
+    jchar CallStaticCharMethod(jclass clazz,
+			       jmethodID methodID, ...) {
+        va_list args;
+	jchar result;
+	va_start(args,methodID);
+	result = functions->CallStaticCharMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jchar CallStaticCharMethodV(jclass clazz,
+				jmethodID methodID, va_list args) {
+        return functions->CallStaticCharMethodV(this,clazz,methodID,args);
+    }
+    jchar CallStaticCharMethodA(jclass clazz,
+				jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticCharMethodA(this,clazz,methodID,args);
+    }
+
+    jshort CallStaticShortMethod(jclass clazz,
+				 jmethodID methodID, ...) {
+        va_list args;
+	jshort result;
+	va_start(args,methodID);
+	result = functions->CallStaticShortMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jshort CallStaticShortMethodV(jclass clazz,
+				  jmethodID methodID, va_list args) {
+        return functions->CallStaticShortMethodV(this,clazz,methodID,args);
+    }
+    jshort CallStaticShortMethodA(jclass clazz,
+				  jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticShortMethodA(this,clazz,methodID,args);
+    }
+
+    jint CallStaticIntMethod(jclass clazz,
+			     jmethodID methodID, ...) {
+        va_list args;
+	jint result;
+	va_start(args,methodID);
+	result = functions->CallStaticIntMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jint CallStaticIntMethodV(jclass clazz,
+			      jmethodID methodID, va_list args) {
+        return functions->CallStaticIntMethodV(this,clazz,methodID,args);
+    }
+    jint CallStaticIntMethodA(jclass clazz,
+			      jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticIntMethodA(this,clazz,methodID,args);
+    }
+
+    jlong CallStaticLongMethod(jclass clazz,
+			       jmethodID methodID, ...) {
+        va_list args;
+	jlong result;
+	va_start(args,methodID);
+	result = functions->CallStaticLongMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jlong CallStaticLongMethodV(jclass clazz,
+				jmethodID methodID, va_list args) {
+        return functions->CallStaticLongMethodV(this,clazz,methodID,args);
+    }
+    jlong CallStaticLongMethodA(jclass clazz,
+				jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticLongMethodA(this,clazz,methodID,args);
+    }
+
+    jfloat CallStaticFloatMethod(jclass clazz,
+				 jmethodID methodID, ...) {
+        va_list args;
+	jfloat result;
+	va_start(args,methodID);
+	result = functions->CallStaticFloatMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jfloat CallStaticFloatMethodV(jclass clazz,
+				  jmethodID methodID, va_list args) {
+        return functions->CallStaticFloatMethodV(this,clazz,methodID,args);
+    }
+    jfloat CallStaticFloatMethodA(jclass clazz,
+				  jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticFloatMethodA(this,clazz,methodID,args);
+    }
+
+    jdouble CallStaticDoubleMethod(jclass clazz,
+				   jmethodID methodID, ...) {
+        va_list args;
+	jdouble result;
+	va_start(args,methodID);
+	result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
+	va_end(args);
+	return result;
+    }
+    jdouble CallStaticDoubleMethodV(jclass clazz,
+				    jmethodID methodID, va_list args) {
+        return functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
+    }
+    jdouble CallStaticDoubleMethodA(jclass clazz,
+				    jmethodID methodID, const jvalue *args) {
+        return functions->CallStaticDoubleMethodA(this,clazz,methodID,args);
+    }
+
+    void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {
+        va_list args;
+	va_start(args,methodID);
+	functions->CallStaticVoidMethodV(this,cls,methodID,args);
+	va_end(args);
+    }
+    void CallStaticVoidMethodV(jclass cls, jmethodID methodID,
+			       va_list args) {
+        functions->CallStaticVoidMethodV(this,cls,methodID,args);
+    }
+    void CallStaticVoidMethodA(jclass cls, jmethodID methodID,
+			       const jvalue * args) {
+        functions->CallStaticVoidMethodA(this,cls,methodID,args);
+    }
+
+    jfieldID GetStaticFieldID(jclass clazz, const char *name,
+			      const char *sig) {
+        return functions->GetStaticFieldID(this,clazz,name,sig);
+    }
+    jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticObjectField(this,clazz,fieldID);
+    }
+    jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticBooleanField(this,clazz,fieldID);
+    }
+    jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticByteField(this,clazz,fieldID);
+    }
+    jchar GetStaticCharField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticCharField(this,clazz,fieldID);
+    }
+    jshort GetStaticShortField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticShortField(this,clazz,fieldID);
+    }
+    jint GetStaticIntField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticIntField(this,clazz,fieldID);
+    }
+    jlong GetStaticLongField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticLongField(this,clazz,fieldID);
+    }
+    jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticFloatField(this,clazz,fieldID);
+    }
+    jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) {
+        return functions->GetStaticDoubleField(this,clazz,fieldID);
+    }
+
+    void SetStaticObjectField(jclass clazz, jfieldID fieldID,
+			jobject value) {
+      functions->SetStaticObjectField(this,clazz,fieldID,value);
+    }
+    void SetStaticBooleanField(jclass clazz, jfieldID fieldID,
+			jboolean value) {
+      functions->SetStaticBooleanField(this,clazz,fieldID,value);
+    }
+    void SetStaticByteField(jclass clazz, jfieldID fieldID,
+			jbyte value) {
+      functions->SetStaticByteField(this,clazz,fieldID,value);
+    }
+    void SetStaticCharField(jclass clazz, jfieldID fieldID,
+			jchar value) {
+      functions->SetStaticCharField(this,clazz,fieldID,value);
+    }
+    void SetStaticShortField(jclass clazz, jfieldID fieldID,
+			jshort value) {
+      functions->SetStaticShortField(this,clazz,fieldID,value);
+    }
+    void SetStaticIntField(jclass clazz, jfieldID fieldID,
+			jint value) {
+      functions->SetStaticIntField(this,clazz,fieldID,value);
+    }
+    void SetStaticLongField(jclass clazz, jfieldID fieldID,
+			jlong value) {
+      functions->SetStaticLongField(this,clazz,fieldID,value);
+    }
+    void SetStaticFloatField(jclass clazz, jfieldID fieldID,
+			jfloat value) {
+      functions->SetStaticFloatField(this,clazz,fieldID,value);
+    }
+    void SetStaticDoubleField(jclass clazz, jfieldID fieldID,
+			jdouble value) {
+      functions->SetStaticDoubleField(this,clazz,fieldID,value);
+    }
+
+    jstring NewString(const jchar *unicode, jsize len) {
+        return functions->NewString(this,unicode,len);
+    }
+    jsize GetStringLength(jstring str) {
+        return functions->GetStringLength(this,str);
+    }
+    const jchar *GetStringChars(jstring str, jboolean *isCopy) {
+        return functions->GetStringChars(this,str,isCopy);
+    }
+    void ReleaseStringChars(jstring str, const jchar *chars) {
+        functions->ReleaseStringChars(this,str,chars);
+    }
+
+    jstring NewStringUTF(const char *utf) {
+        return functions->NewStringUTF(this,utf);
+    }
+    jsize GetStringUTFLength(jstring str) {
+        return functions->GetStringUTFLength(this,str);
+    }
+    const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
+        return functions->GetStringUTFChars(this,str,isCopy);
+    }
+    void ReleaseStringUTFChars(jstring str, const char* chars) {
+        functions->ReleaseStringUTFChars(this,str,chars);
+    }
+
+    jsize GetArrayLength(jarray array) {
+        return functions->GetArrayLength(this,array);
+    }
+
+    jobjectArray NewObjectArray(jsize len, jclass clazz,
+				jobject init) {
+        return functions->NewObjectArray(this,len,clazz,init);
+    }
+    jobject GetObjectArrayElement(jobjectArray array, jsize index) {
+        return functions->GetObjectArrayElement(this,array,index);
+    }
+    void SetObjectArrayElement(jobjectArray array, jsize index,
+			       jobject val) {
+        functions->SetObjectArrayElement(this,array,index,val);
+    }
+
+    jbooleanArray NewBooleanArray(jsize len) {
+        return functions->NewBooleanArray(this,len);
+    }
+    jbyteArray NewByteArray(jsize len) {
+        return functions->NewByteArray(this,len);
+    }
+    jcharArray NewCharArray(jsize len) {
+        return functions->NewCharArray(this,len);
+    }
+    jshortArray NewShortArray(jsize len) {
+        return functions->NewShortArray(this,len);
+    }
+    jintArray NewIntArray(jsize len) {
+        return functions->NewIntArray(this,len);
+    }
+    jlongArray NewLongArray(jsize len) {
+        return functions->NewLongArray(this,len);
+    }
+    jfloatArray NewFloatArray(jsize len) {
+        return functions->NewFloatArray(this,len);
+    }
+    jdoubleArray NewDoubleArray(jsize len) {
+        return functions->NewDoubleArray(this,len);
+    }
+
+    jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) {
+        return functions->GetBooleanArrayElements(this,array,isCopy);
+    }
+    jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) {
+        return functions->GetByteArrayElements(this,array,isCopy);
+    }
+    jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) {
+        return functions->GetCharArrayElements(this,array,isCopy);
+    }
+    jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) {
+        return functions->GetShortArrayElements(this,array,isCopy);
+    }
+    jint * GetIntArrayElements(jintArray array, jboolean *isCopy) {
+        return functions->GetIntArrayElements(this,array,isCopy);
+    }
+    jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) {
+        return functions->GetLongArrayElements(this,array,isCopy);
+    }
+    jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) {
+        return functions->GetFloatArrayElements(this,array,isCopy);
+    }
+    jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) {
+        return functions->GetDoubleArrayElements(this,array,isCopy);
+    }
+
+    void ReleaseBooleanArrayElements(jbooleanArray array,
+				     jboolean *elems,
+				     jint mode) {
+        functions->ReleaseBooleanArrayElements(this,array,elems,mode);
+    }
+    void ReleaseByteArrayElements(jbyteArray array,
+				  jbyte *elems,
+				  jint mode) {
+        functions->ReleaseByteArrayElements(this,array,elems,mode);
+    }
+    void ReleaseCharArrayElements(jcharArray array,
+				  jchar *elems,
+				  jint mode) {
+        functions->ReleaseCharArrayElements(this,array,elems,mode);
+    }
+    void ReleaseShortArrayElements(jshortArray array,
+				   jshort *elems,
+				   jint mode) {
+        functions->ReleaseShortArrayElements(this,array,elems,mode);
+    }
+    void ReleaseIntArrayElements(jintArray array,
+				 jint *elems,
+				 jint mode) {
+        functions->ReleaseIntArrayElements(this,array,elems,mode);
+    }
+    void ReleaseLongArrayElements(jlongArray array,
+				  jlong *elems,
+				  jint mode) {
+        functions->ReleaseLongArrayElements(this,array,elems,mode);
+    }
+    void ReleaseFloatArrayElements(jfloatArray array,
+				   jfloat *elems,
+				   jint mode) {
+        functions->ReleaseFloatArrayElements(this,array,elems,mode);
+    }
+    void ReleaseDoubleArrayElements(jdoubleArray array,
+				    jdouble *elems,
+				    jint mode) {
+        functions->ReleaseDoubleArrayElements(this,array,elems,mode);
+    }
+
+    void GetBooleanArrayRegion(jbooleanArray array,
+			       jsize start, jsize len, jboolean *buf) {
+        functions->GetBooleanArrayRegion(this,array,start,len,buf);
+    }
+    void GetByteArrayRegion(jbyteArray array,
+			    jsize start, jsize len, jbyte *buf) {
+        functions->GetByteArrayRegion(this,array,start,len,buf);
+    }
+    void GetCharArrayRegion(jcharArray array,
+			    jsize start, jsize len, jchar *buf) {
+        functions->GetCharArrayRegion(this,array,start,len,buf);
+    }
+    void GetShortArrayRegion(jshortArray array,
+			     jsize start, jsize len, jshort *buf) {
+        functions->GetShortArrayRegion(this,array,start,len,buf);
+    }
+    void GetIntArrayRegion(jintArray array,
+			   jsize start, jsize len, jint *buf) {
+        functions->GetIntArrayRegion(this,array,start,len,buf);
+    }
+    void GetLongArrayRegion(jlongArray array,
+			    jsize start, jsize len, jlong *buf) {
+        functions->GetLongArrayRegion(this,array,start,len,buf);
+    }
+    void GetFloatArrayRegion(jfloatArray array,
+			     jsize start, jsize len, jfloat *buf) {
+        functions->GetFloatArrayRegion(this,array,start,len,buf);
+    }
+    void GetDoubleArrayRegion(jdoubleArray array,
+			      jsize start, jsize len, jdouble *buf) {
+        functions->GetDoubleArrayRegion(this,array,start,len,buf);
+    }
+
+    void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
+			       const jboolean *buf) {
+        functions->SetBooleanArrayRegion(this,array,start,len,buf);
+    }
+    void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
+			    const jbyte *buf) {
+        functions->SetByteArrayRegion(this,array,start,len,buf);
+    }
+    void SetCharArrayRegion(jcharArray array, jsize start, jsize len,
+			    const jchar *buf) {
+        functions->SetCharArrayRegion(this,array,start,len,buf);
+    }
+    void SetShortArrayRegion(jshortArray array, jsize start, jsize len,
+			     const jshort *buf) {
+        functions->SetShortArrayRegion(this,array,start,len,buf);
+    }
+    void SetIntArrayRegion(jintArray array, jsize start, jsize len,
+			   const jint *buf) {
+        functions->SetIntArrayRegion(this,array,start,len,buf);
+    }
+    void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
+			    const jlong *buf) {
+        functions->SetLongArrayRegion(this,array,start,len,buf);
+    }
+    void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
+			     const jfloat *buf) {
+        functions->SetFloatArrayRegion(this,array,start,len,buf);
+    }
+    void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
+			      const jdouble *buf) {
+        functions->SetDoubleArrayRegion(this,array,start,len,buf);
+    }
+
+    jint RegisterNatives(jclass clazz, const JNINativeMethod *methods,
+			 jint nMethods) {
+        return functions->RegisterNatives(this,clazz,methods,nMethods);
+    }
+    jint UnregisterNatives(jclass clazz) {
+        return functions->UnregisterNatives(this,clazz);
+    }
+
+    jint MonitorEnter(jobject obj) {
+        return functions->MonitorEnter(this,obj);
+    }
+    jint MonitorExit(jobject obj) {
+        return functions->MonitorExit(this,obj);
+    }
+
+    jint GetJavaVM(JavaVM **vm) {
+        return functions->GetJavaVM(this,vm);
+    }
+
+    void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) {
+        functions->GetStringRegion(this,str,start,len,buf);
+    }
+    void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) {
+        functions->GetStringUTFRegion(this,str,start,len,buf);
+    }
+
+    void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) {
+        return functions->GetPrimitiveArrayCritical(this,array,isCopy);
+    }
+    void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) {
+        functions->ReleasePrimitiveArrayCritical(this,array,carray,mode);
+    }
+
+    const jchar * GetStringCritical(jstring string, jboolean *isCopy) {
+        return functions->GetStringCritical(this,string,isCopy);
+    }
+    void ReleaseStringCritical(jstring string, const jchar *cstring) {
+        functions->ReleaseStringCritical(this,string,cstring);
+    }
+
+    jweak NewWeakGlobalRef(jobject obj) {
+        return functions->NewWeakGlobalRef(this,obj);
+    }
+    void DeleteWeakGlobalRef(jweak ref) {
+        functions->DeleteWeakGlobalRef(this,ref);
+    }
+
+    jboolean ExceptionCheck() {
+	return functions->ExceptionCheck(this);
+    }
+
+    jobject NewDirectByteBuffer(void* address, jlong capacity) {
+        return functions->NewDirectByteBuffer(this, address, capacity);
+    }
+    void* GetDirectBufferAddress(jobject buf) {
+        return functions->GetDirectBufferAddress(this, buf);
+    }
+    jlong GetDirectBufferCapacity(jobject buf) {
+        return functions->GetDirectBufferCapacity(this, buf);
+    }
+    jobjectRefType GetObjectRefType(jobject obj) {
+        return functions->GetObjectRefType(this, obj);
+    }
+
+#endif /* __cplusplus */
+};
+
+typedef struct JavaVMOption {
+    char *optionString;
+    void *extraInfo;
+} JavaVMOption;
+
+typedef struct JavaVMInitArgs {
+    jint version;
+
+    jint nOptions;
+    JavaVMOption *options;
+    jboolean ignoreUnrecognized;
+} JavaVMInitArgs;
+
+typedef struct JavaVMAttachArgs {
+    jint version;
+
+    char *name;
+    jobject group;
+} JavaVMAttachArgs;
+
+/* These will be VM-specific. */
+
+#define JDK1_2
+#define JDK1_4
+
+/* End VM-specific. */
+
+struct JNIInvokeInterface_ {
+    void *reserved0;
+    void *reserved1;
+    void *reserved2;
+
+    jint (JNICALL *DestroyJavaVM)(JavaVM *vm);
+
+    jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args);
+
+    jint (JNICALL *DetachCurrentThread)(JavaVM *vm);
+
+    jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version);
+
+    jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args);
+};
+
+struct JavaVM_ {
+    const struct JNIInvokeInterface_ *functions;
+#ifdef __cplusplus
+
+    jint DestroyJavaVM() {
+        return functions->DestroyJavaVM(this);
+    }
+    jint AttachCurrentThread(void **penv, void *args) {
+        return functions->AttachCurrentThread(this, penv, args);
+    }
+    jint DetachCurrentThread() {
+        return functions->DetachCurrentThread(this);
+    }
+
+    jint GetEnv(void **penv, jint version) {
+        return functions->GetEnv(this, penv, version);
+    }
+    jint AttachCurrentThreadAsDaemon(void **penv, void *args) {
+        return functions->AttachCurrentThreadAsDaemon(this, penv, args);
+    }
+#endif
+};
+
+#ifdef _JNI_IMPLEMENTATION_
+#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT
+#else
+#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT
+#endif
+_JNI_IMPORT_OR_EXPORT_ jint JNICALL
+JNI_GetDefaultJavaVMInitArgs(void *args);
+
+_JNI_IMPORT_OR_EXPORT_ jint JNICALL
+JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
+
+_JNI_IMPORT_OR_EXPORT_ jint JNICALL
+JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
+
+/* Defined by native libraries. */
+JNIEXPORT jint JNICALL
+JNI_OnLoad(JavaVM *vm, void *reserved);
+
+JNIEXPORT void JNICALL
+JNI_OnUnload(JavaVM *vm, void *reserved);
+
+#define JNI_VERSION_1_1 0x00010001
+#define JNI_VERSION_1_2 0x00010002
+#define JNI_VERSION_1_4 0x00010004
+#define JNI_VERSION_1_6 0x00010006
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#endif /* !_JAVASOFT_JNI_H_ */
+
+
+
diff --git a/installer/c/limewireExe/jni_md.h b/installer/c/limewireExe/jni_md.h
new file mode 100644
index 0000000000..9f0cfa4638
--- /dev/null
+++ b/installer/c/limewireExe/jni_md.h
@@ -0,0 +1,19 @@
+/*
+ * @(#)jni_md.h	1.15 05/11/17
+ *
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+#ifndef _JAVASOFT_JNI_MD_H_
+#define _JAVASOFT_JNI_MD_H_
+
+#define JNIEXPORT __declspec(dllexport)
+#define JNIIMPORT __declspec(dllimport)
+#define JNICALL __stdcall
+
+typedef long jint;
+typedef __int64 jlong;
+typedef signed char jbyte;
+
+#endif /* !_JAVASOFT_JNI_MD_H_ */
diff --git a/installer/c/limewireExe/limewire.c b/installer/c/limewireExe/limewire.c
new file mode 100644
index 0000000000..876e49fa3f
--- /dev/null
+++ b/installer/c/limewireExe/limewire.c
@@ -0,0 +1,234 @@
+/** 
+ * Customized LimeWire launcher.
+ * Launches the JRE within the process, to allow Task Manager to show
+ * "LimeWire.exe" as the process, and firewalls to control access of
+ * "LimeWire.exe".
+ */
+
+#include "errors.h"
+
+#include <windows.h> 
+#include <stdio.h>   
+#include <malloc.h>
+#include <sys/stat.h>
+
+//BOOL MoveFontPropertiesFile(const char *path);
+void SetWorkingDirectory(char *path);
+void readOptions(char***, int*);
+//BOOL localJREExists(const char*);
+BOOL exist(const char*);
+
+// defined in java.c
+extern void* MemAlloc(size_t);
+// defined in java.c
+extern int launchJVM(int, char**);
+
+
+int
+main(int argc, char** argv) {
+
+	int read_options_size;
+	char** read_options;
+	int ret = 0;
+	int current_argc = 0;
+	int new_argc;
+	char** new_argv;
+	int i;
+	char currentDirectory[MAX_PATH+1];
+
+	// Set/get the correct working directory.
+	SetWorkingDirectory(currentDirectory);
+
+	// Read in options from disk (launch.properties)
+	// or the default ones (if no launch.properties existed)
+	readOptions(&read_options, &read_options_size);
+
+	// Construct a new argc & argv to pass to launchJVM
+	new_argc = read_options_size + argc;
+	new_argv = (char**)MemAlloc(sizeof(char*) * (new_argc+1));
+
+	// copy process name
+	new_argv[0] = argv[0];
+	// copy arguments from properties file
+	for(i = 1; i <= read_options_size; i++)
+		new_argv[i] = read_options[i-1];
+	// copy argv arguments as arguments after the properties file
+	// (generally used as arguments for LimeWire)
+	for(current_argc = 1; current_argc < argc; current_argc++)
+		new_argv[i++] = argv[current_argc];
+
+	new_argv[i] = NULL;
+
+	// options are no longer necessary -- free them up.
+	if(read_options != 0)
+		free(read_options);
+
+    ret = launchJVM(new_argc, new_argv);
+	free(new_argv);
+	switch(ret) {
+	case ERROR_COULDNT_FIND_JVM:
+	case ERROR_COULDNT_INITIALIZE_JVM:
+	case ERROR_COULDNT_LOAD_JVM:
+		if (MessageBox(NULL, "MuWire needs the Java Runtime Environment 6.0 or above. Click OK to go to www.java.com, where you can install Java.", 
+		       "MuWire Launcher Error",
+		       MB_ICONWARNING | MB_OKCANCEL) == IDOK)
+			ShellExecute(NULL, NULL, "http://www.java.com/", "", "", SW_SHOWNORMAL);
+		break;
+	case ERROR_COULDNT_PARSE_ARGUMENTS:
+		MessageBox(NULL, "MuWire failed to parse the commandline arguments to Java.\n"
+			"Please download and install MuWire again.",
+			"MuWire Launcher Error", MB_OK);
+		break;
+	case ERROR_STARTING_PROGRAM:
+		MessageBox(NULL, "MuWire was unable to load.\n"
+				"Please download and install MuWire again.",
+				"MuWire Launcher Error", MB_OK);
+		break;
+	}
+	return ret;
+}
+
+
+
+#define MAX_OPTION_SIZE 100
+#define MAX_OPTIONS 100
+
+/**
+ * Read in the launch.properties file and generate psuedo-commandline arguments.
+ */
+void readOptions(char*** options, int* size) {
+	FILE* file;
+	char* buffer;
+	int i;
+	size_t currentlen;
+	char* command;	
+
+	file = fopen("launch.properties", "r");
+	if(file == NULL) {
+		// default to certain values.
+		*size = 10;
+#ifdef ALPHA
+		*size = (*size) + 1;
+#endif
+		
+		*options = (char**)MemAlloc(sizeof(char*) * (*size));
+		i = 0;
+		(*options)[i++] = "-Xms64m";
+		(*options)[i++] = "-Xmx256m";
+		(*options)[i++] = "-Dasdf=fdsa";
+		(*options)[i++] = "-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog";
+		//(*options)[i++] = "-Djava.net.preferIPv6Addresses=false";
+		(*options)[i++] = "-Djava.net.preferIPv4Stack=true";
+		(*options)[i++] = "-ea:com.limegroup...";
+		(*options)[i++] = "-ea:org.limewire...";
+		(*options)[i++] = "-Djava.library.path=lib";
+		(*options)[i++] = "-jar";
+		(*options)[i++] = "lib\\MuWire.jar";
+#ifdef ALPHA
+#pragma message ("\n\n!!!!!!!!!!!!!! building ALPHA !!!!!!!!!!!!!!\n\n")
+		(*options)[(*size) - 3] = "-agentlib:yjpagent=port=11111";
+		(*options)[(*size) - 2] = "-jar";
+		(*options)[(*size) - 1] = "LimeWire.jar";
+#endif
+		return;
+	}
+
+	*options = (char**)MemAlloc(sizeof(char*) * MAX_OPTIONS);
+	*size = 0;
+
+	for(i = 0; i < MAX_OPTIONS && !feof(file); i++) {
+		buffer = (char*)MemAlloc(sizeof(char) * MAX_OPTION_SIZE);
+		// get the next option.
+		if(fgets(buffer, MAX_OPTION_SIZE - 1, file) == NULL)
+			break;
+		// strip off the \n if it exists.
+		currentlen = strlen(buffer);
+		if(currentlen > 0 && buffer[currentlen-1] == '\n') {
+			buffer[currentlen-1] = 0;
+			currentlen--;
+		}
+		// downsize the storage for the command.
+		currentlen++; // (include \0)
+		command = (char*)MemAlloc(sizeof(char) * currentlen);
+		strcpy(command, buffer);
+		free(buffer);
+
+		// set the option & increase the size
+		if(currentlen > 0) {
+			(*options)[i] = command;
+			(*size)++;
+		}
+	}
+
+	if(file != NULL)
+		fclose(file);
+}
+
+/*
+ * Sets the current working directory to wherever LimeWire.exe is located
+ */
+static void
+SetWorkingDirectory(char *path) {
+	GetModuleFileName(NULL, path, MAX_PATH + 1);
+	*strrchr(path, '\\') = '\0'; // remove the .exe
+	SetCurrentDirectory(path);
+	GetCurrentDirectory(MAX_PATH + 1, path);
+}
+
+/**
+ * Checks to see if an app-installed JRE exists.
+ */
+/*
+BOOL localJREExists(const char* path) {
+	char localBuf[MAX_PATH + 1];
+	sprintf(localBuf, "%s\\jre\\bin\\hotspot\\jvm.dll\0", path);
+	return exist(localBuf);
+}
+*/
+
+/**
+ * Copies the windows.font.properties file to the jre so that
+ * we use the proper fonts for international installs.
+ */
+/*
+BOOL
+MoveFontPropertiesFile(const char *path) {
+	char curFontFile[MAX_PATH + 1];
+	char newFontFile[MAX_PATH + 1];
+	BOOL copySucceeded;
+	sprintf(curFontFile, "%s\\windows.font.properties\0", path);
+	sprintf(newFontFile, "%s\\jre\\lib\\font.properties\0", path);
+	if(!exist(curFontFile))
+		return TRUE;
+
+	copySucceeded = CopyFile(curFontFile, newFontFile, FALSE);
+	if(copySucceeded)
+		DeleteFile(curFontFile);
+	return copySucceeded;
+}
+*/
+
+BOOL exist(const char *filename) {
+	struct stat s;
+	return stat(filename, &s) == 0 ? TRUE : FALSE;
+}
+
+
+__declspec(dllimport) char **__initenv;
+
+int WINAPI
+WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow)
+{
+    int   ret;
+
+    /* It turns out, that Windows can set thread locale to default user locale 
+     * instead of default system locale. We correct this by explicitely setting
+     * thread locale to system default.
+     */
+    SetThreadLocale(GetSystemDefaultLCID());
+
+    __initenv = _environ;
+    ret = main(__argc, __argv);
+
+    return ret; 
+}
\ No newline at end of file
diff --git a/installer/c/limewireExe/merged icon.ico b/installer/c/limewireExe/merged icon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..d43cef886eb91d286c0208e0d84baa3bd7b41f4d
GIT binary patch
literal 97294
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

literal 0
HcmV?d00001

diff --git a/installer/c/limewireExe/resource1.h b/installer/c/limewireExe/resource1.h
new file mode 100644
index 0000000000..cd8ba7818e
--- /dev/null
+++ b/installer/c/limewireExe/resource1.h
@@ -0,0 +1,17 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by LimeWire31.rc
+//
+#define IDI_ICON1                       111
+#define IDI_ICON2                       112
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        113
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/installer/c/limewireExe/torrent.ico b/installer/c/limewireExe/torrent.ico
new file mode 100644
index 0000000000000000000000000000000000000000..3a4da56a01182ff29a808612d1549fbbbb86975e
GIT binary patch
literal 25214
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
Hu4(*V@^m`>

literal 0
HcmV?d00001

-- 
GitLab