Quote from MRP-14 ( https://web.archive.org/web/20150521201219/http://jira.codehaus.org/browse/MRP-14 ):
Currently a call into the runtime from C via JNI can, in the case of a method call or creating a new object, use bespoke architecture and OS dependent stack manipulation code. This code is very problematic to port, in particular if an architecture uses registers for var args, like x86 64. By converting the access to var args into C code we can remove many thousands of lines of bespoke stack manipulation code with a few lines of C. This C code doesn't need porting to new architectures as the var arg semantics on both side will be the same. As a va_list passed by copying and not by reference, the va_copy routine is necessary to establish a va_list that can be worked over by syscalls. This requires memory allocation and freeing, and so this approach may be marginally less optimal. To handle the cases where the var args are specified as ... , C routines should bounce in the appropriate V routine with a va_list.