Pase sin problemas matrices y listas desde y hacia Nashorn

Sé que puedes trabajar con matrices Java en Nashorn y hay muchos ejemplos de cómo hacerlo. El problema para mí con el enfoque estándar es que hace que el código JavaScript explícitamente sea consciente de su entorno de tiempo de ejecución. Actualmente tengo una solución que hace uso de Rhino y convierte sin problemas entre los tipos de Java y los tipos de JavaScript nativo.

Para Rhino logré esto implementandoorg.mozilla.javascript.ContextFactory yorg.mozilla.javascript.WrapFActory y ambientaciónWrapFactory sobre elContext cuandomakeContext se llama. Esta implementación de WrapFactory se encarga de convertir entre matrices y listas Java y matrices y listas JavaScript nativas. También es incorrecto mencionar que tuve que obtener el código fuente de Rhino del JDK para que este enfoque funcione.

Necesito encontrar una solución similar para Nashorn. Aquí hay un ejemplo de lo que estoy tratando de lograr.

public static void main(String args[]) {
    NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
    ScriptEngine engine = factory.getScriptEngine();
    try {
        engine.eval("function print_array(arr) { print(arr); }");
        engine.eval("function print_native() { print_array([1, 2, 3, 4]); }");
        Invocable invocable = (Invocable) engine;
        invocable.invokeFunction("print_array", new int[]{1, 2, 3, 4});
        invocable.invokeFunction("print_array", Arrays.asList(1, 2, 3, 4));
        invocable.invokeFunction("print_native");
    } catch (ScriptException | NoSuchMethodException e) {
        e.printStackTrace();
    }
}

La salida de este código es

[I @ 169e6180

[1, 2, 3, 4]

1,2,3,4

Estoy buscando una manera de implementar un ScriptObjectMirror, suponiendo que sea incluso correcto, que haga que la salida de esos tresinvokeFunction las llamadas sean las mismas

He intentado usarwrap funcionar enScriptUtils, pero aun así el resultado es incorrecto

ACTUALIZAR

Traté de crear un proxy dinámico de tipoInvocable y hacer conversiones en elInvocationHandler. Para crear una matriz nativa con Nashorn, parece que deberías usarjdk.nashorn.internal.objects.Global.allocate, pero esto siempre plantea una excepción.

Global.allocate(new int[] {1, 2, 3, 4})

Plantea

Exception in thread "main" java.lang.NullPointerException
    at jdk.nashorn.internal.objects.Global.instance(Global.java:491)
    at jdk.nashorn.internal.objects.NativeArray.<init>(NativeArray.java:141)
    at jdk.nashorn.internal.objects.Global.allocate(Global.java:1584)

Respuestas a la pregunta(1)

Su respuesta a la pregunta