hotspot source code - call java main method

vm/prims/jni.cpp1311行,jni_invoke_static()方法中第1329行通过JavaCalls::call()方法调用 Java 的main(String[])方法,源码如下:

13111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336
static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {  methodHandle method(THREAD, Method::resolve_jmethod_id(method_id));  // Create object to hold arguments for the JavaCall, and associate it with  // the jni parser  ResourceMark rm(THREAD);  int number_of_parameters = method->size_of_parameters();  JavaCallArguments java_args(number_of_parameters);  args->set_java_argument_object(&java_args);  assert(method->is_static(), "method should be static");  // Fill out JavaCallArguments object  args->iterate( Fingerprinter(method).fingerprint() );  // Initialize result type  result->set_type(args->get_ret_type());  // Invoke the method. Result is returned as oop.  JavaCalls::call(result, method, &java_args, CHECK);  // Convert result  if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {    result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));  }}

References

  1. vm/prims/jni.cpp