Métodos JNI de llamada de Delphi con lista de argumentos variables

Usando la unidad Jni api de Embarcadero, ¿cómo se pueden proporcionar listas de argumentos variables a los métodos JNI que lo requieren? Por ejemplo, el método CallStaticObjectMethodV () de JNINativeInterface (listado 1) tiene un último parámetro de tipo va_list, que se supone que encapsula una lista variable de argumentos. En el código C ++ (listado 2) que llama a este método, la firma del método está marcada como varargs, lo cual es sorprendente porque no hay decoración varargs en la unidad AndroidApi.Jni de Delphi.

¿Cómo se supone que debes construir el parámetro Args para lograr lo mismo en Delphi? Mi intento, que se muestra en el listado 3 no funciona.

Listado 1: Extracto de la unidad Androidapi.Jni, ligeramente adaptado para la plataforma Windows (cambió cdecl por stdcall)
JNINativeInterface = packed record
    ...
    CallStaticObjectMethod : function(Env: PJNIEnv; AClass: JNIClass; MethodID: JNIMethodID): JNIObject; stdcall;
    CallStaticObjectMethodV: function(Env: PJNIEnv; AClass: JNIClass; MethodID: JNIMethodID; Args: va_list  ): JNIObject; stdcall;
    CallStaticObjectMethodA: function(Env: PJNIEnv; AClass: JNIClass; MethodID: JNIMethodID; Args: PJNIValue): JNIObject; stdcall;
Listado 2: Un ejemplo de cómo se llama desde C ++

El Listado 2 fue extraído de la biblioteca Saxon / C.

XdmValue * SaxonProcessor::parseFile(const char* source){

    jmethodID mID = (jmethodID)env->GetStaticMethodID(saxonCAPIClass, "xmlParseFile", "(Lnet/sf/saxon/s9api/Processor;Ljava/lang/String;Ljava/lang/String;)Lnet/sf/saxon/s9api/XdmNode;");
    if (!mID) {
    cerr<<"\nError: MyClassInDll "<<"xmlParseFile()"<<" not found"<<endl;
        return NULL;
    }
   jobject xdmNodei = env->CallStaticObjectMethod(saxonCAPIClass, mID, proc, env->NewStringUTF(cwd.c_str()),  env->NewStringUTF(source));
     if(exceptionOccurred()) {
       exception= checkForException(env, saxonCAPIClass, NULL);
     } else {
    XdmValue * value = new XdmValue(xdmNodei);
    value->setProcessor(this);
    return value;
   }
   return NULL;
}
Listado 3: Mi intento de traducir el listado 2 a Delphi
var
  mID: JNIMethodID;
  xdmNodei: JNIObject;
  Str1, Str2: JNIString;
  Hold1, Hold2: TBytes;
  ArgsAsList: va_list;
  Data: TBytes;
  Sz: integer;
begin
  mID := FJNIEnv.GetStaticMethodID( Fpenv, FsaxonCAPIClass, 'xmlParseFile',
    '(Lnet/sf/saxon/s9api/Processor;Ljava/lang/String;Ljava/lang/String;)Lnet/sf/saxon/s9api/XdmNode;');
  Str1 := FJNIEnv.NewStringUTF( Fpenv, String_to_MarshaledAString( Fcwd  , Hold1));
  Str2 := FJNIEnv.NewStringUTF( Fpenv, String_to_MarshaledAString( Source, Hold2));
  Sz := SizeOf( JNIString);
  SetLength( Data, 3 * Sz);
  FillChar( Data[0], Length( Data), 0);
  Move( Str1, Data[0], Sz);
  Move( Str1, Data[Sz], Sz);
  ArgsAsList := va_list( @Data[0]);
  xdmNodei := FJNIEnv.CallStaticObjectMethodV( Fpenv, FsaxonCAPIClass, mID, ArgsAsList);
Lo que tampoco ha funcionado

También he intentado volver a declarar el tipo de método para decorar con varargs e implementar los varargs que pasan con ensamblador, utilizando el método descrito en estas soluciones. No funcionaron (Infracción de acceso).

¿Cómo puede una función con 'varargs' recuperar el contenido de la pila?Delphi "matriz de const" a "varargs"Un poco mas informacion

La plataforma objetivo es Win32. Hice una copia de AndroidApi.jni.pas para Windows (WinApi.jni.pas) Acabo de cambiar las decoraciones de cdecl para stdcall. stdcall es correcto, y puedo usar la unidad para iniciar JavaVM y hacer otras cosas JNI. Embaracedero no marca CallStaticObjectMethodV () como varargs, pero ¿tal vez sea un error?

Actualización: la solución final

Gracias aEnvoltorio JNI de Jonathan Revusky, Encontré una solución de trabajo ...

El código que funciona es ...

function TSaxonProcessor.parseFile( const Source: string): TXdmValue;
var
  mID: JNIMethodID;
  xdmNodei: JNIObject;
  Str1, Str2: JNIString;
  Hold1, Hold2: TBytes;
  Data: TArray<JNIString>;
begin
  mID := FJNIEnv.GetStaticMethodID( Fpenv, FsaxonCAPIClass, 'xmlParseFile',
    '(Lnet/sf/saxon/s9api/Processor;Ljava/lang/String;Ljava/lang/String;)Lnet/sf/saxon/s9api/XdmNode;');
  Str1 := FJNIEnv.NewStringUTF( Fpenv, String_to_MarshaledAString( Fcwd  , Hold1));
  Str2 := FJNIEnv.NewStringUTF( Fpenv, String_to_MarshaledAString( Source, Hold2));
  SetLength( Data, 3);
  Data[0] := FProc;
  Data[1] := Str1;
  Data[2] := Str2;
  xdmNodei := FJNIEnv.CallStaticObjectMethodV( Fpenv, FsaxonCAPIClass, mID, @Data[0]);
end;