My curent JavaScript looks like this:
o.timer(function (){
//Call from Java
print("Hello World");
}).start(1000);
On the Java side receive a jdk.nashorn.internal.runtime.ScriptFunction witch I tried to call with
ScriptFunction callback = ...
callback.getBoundInvokeHandle(MethodType.methodType(Object.class)).invoke();
But it throws this:
java.lang.IllegalStateException: no current global instance
at jdk.nashorn.internal.objects.Global.instance(Global.java:474)
at jdk.nashorn.internal.objects.ScriptFunctionImpl.<init>(ScriptFunctionImpl.java:145)
at jdk.nashorn.internal.scripts.Script$\^eval\_._L3(<eval>:6)
at demo.Mainr$1.run(Main.java:38)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
How can I call this function?
Don't pass functions between Nashorn and Java. Pass objects which implement functional interfaces.
I assume o.timer
is implemented in Java. In that case, make its parameter a Runnable (the generic functional interface for a function which takes nothing and returns nothing). Nashorn will detect that Java expects a functional interface and will be able to automatically convert the function to an anonymous class which implements that interface, so you don't have to change anything at your Javascript code to make it do that.
In your Java code you can then execute the script function of that Runnable with .run()
. The javascript code will then be executed in the script context in which it was created.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With