If the Javascript is under your control, you could do the transformation there, as per this document. So to adapt your example, something like:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
String convertFuncSrc =
"function convertArray(type, arr) {"
+ " var jArr = java.lang.reflect.Array.newInstance(type, arr.length);"
+ " for (var i = 0; i < arr.length; i++) { "
+ " jArr[i] = arr[i];"
+ " }"
+ " return jArr;"
+ "};";
jsEngine.eval(convertFuncSrc);
Object result = jsEngine.eval("convertArray(java.lang.Integer.TYPE, getArray());");
int[] javaArray = (int[])result;
Although, if you can't change the Javascript this approach won't work, and you [i]will[/i] have an instance of sun.org.mozilla.javascript.internal.NativeArray as your result
variable. At which point I think you just need to cast and deal with it directly, using whatever public methods it exposes; it's probably not pretty but I don't see any other options. In particular I think the only thing you can guarantee at the nice Rhino level is that it will be an instance of Scriptable
(and probably ScriptableObject
), which doesn't help you use it as an Array.
Kevin's answer looks like a good way to go here (and is similar to what I was just about to edit in! :-))