/*
* Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
*/
using System;
using System.Runtime.InteropServices;
class jinvoker{
public static int Main(string[] aArgs){
// Print Hello to show we are in CLR
Console.WriteLine("Hello from C#");
if(aArgs.Length > 0)
// invoke JVM
return InvokeMain(aArgs[0]);
else
return -1;
}
// Link the JVM API functions and the wrappers
[DllImport("jvm.dll")] public unsafe static extern int JNI_CreateJavaVM(void** ppVm, void** ppEnv, void* pArgs);
[DllImport("jinvoker.dll")] public unsafe static extern int MakeJavaVMInitArgs( void** ppArgs );
[DllImport("jinvoker.dll")] public unsafe static extern void FreeJavaVMInitArgs( void* pArgs );
[DllImport("jinvoker.dll")] public unsafe static extern int FindClass( void* pEnv, String sClass, void** ppClass );
[DllImport("jinvoker.dll")] public unsafe static extern int GetStaticMethodID( void* pEnv,
void* pClass,
String szName,
String szArgs,
void** ppMid);
[DllImport("jinvoker.dll")] public unsafe static extern int NewObjectArray( void* pEnv,
int nDimension,
String sType,
void** ppArray );
[DllImport("jinvoker.dll")] public unsafe static extern int CallStaticVoidMethod( void* pEnv,
void* pClass,
void* pMid,
void* pArgs);
[DllImport("jinvoker.dll")] public unsafe static extern int DestroyJavaVM( void* pJVM );
public unsafe static int InvokeMain( String sClass ){
void* pJVM; // JVM struct
void* pEnv; // JVM environment
void* pVMArgs; // VM args
void* pClass; // Class struct of the executed method
void* pMethod; // The executed method struct
void* pArgs; // The executed method arguments struct
// Fill the pVMArgs structs
MakeJavaVMInitArgs( &pVMArgs );
// Create JVM
int nRes = JNI_CreateJavaVM( &pJVM, &pEnv, pVMArgs );
if( nRes == 0 ){
// Find the executed method class
if(FindClass( pEnv, sClass, &pClass) == 0 )
// Find the executed method
if( GetStaticMethodID( pEnv, pClass, "main", "([Ljava/lang/String;)V", &pMethod ) == 0 )
// Create empty String[] array to pass to the main()
if( NewObjectArray( pEnv, 0, "java/lang/String", &pArgs ) == 0 ){
// Call main()
nRes = CallStaticVoidMethod( pEnv, pClass, pMethod, pArgs );
if( nRes != -1 )
Console.WriteLine("Result:"+nRes);
else
Console.WriteLine("Exception");
}else{
Console.WriteLine("Error while making args array");
nRes = -100;
}
else{
Console.WriteLine("can not find method main(String[])");
nRes = -101;
}
else{
Console.WriteLine("can not find class:"+sClass);
nRes = -102;
}
// Destroy the JVM
DestroyJavaVM( pJVM );
}else
Console.WriteLine("Can not create Java VM");
// Free the JVM args structs
FreeJavaVMInitArgs(pVMArgs);
return nRes;
}
}