Home » Android » Does Android's JNI JavaScript binding efficiently pass TypedArray / ArrayBuffer to Java as an array?

Does Android's JNI JavaScript binding efficiently pass TypedArray / ArrayBuffer to Java as an array?

Posted by: admin May 14, 2020 Leave a comment

Questions:

In the Android JNI binding, you can expose a Java method such as method(int[] intArray) {} to JavaScript, pass it a JavaScript array, and expect the binding to convert that JavaScript array to int[]. Does Android have the same handling for e.g. Uint8Array()?

How to&Answers:

The JavaScript engine that runs in Android’s WebView does not support Uint8Arrays, or any of the other typed arrays (as of 2.3.3).

EDIT: I did some more testing with the simulators and I have mixed things to report.

On the plus side, the JavaScript engine in Android 3.x’s WebView does support typed arrays, with the exception of Float64Array.

On the minus side, the JNI interface to Java via WebView.addJavascriptInterface() does not convert the types at all. This is the code I used to test it:

var u8arr = new Uint8Array(4);
u8arr.set([2, 3, 5, 7]);
android.log(u8arr);

And the Java function for android.log() looks basically like this:

public void log(final int[] data) {
    final String dataInfo = (data == null) ? "NULL" : "[" + data.length + "]";
    Log.d("JsJni", "data=" + dataInfo);
    /* ... */
}

When I called android.log with standard Array() type JavaScript object, I’d get the results one would expect (the array bound to data, type conversion, etc…) When android.log was called with the Uint8Array object (or any of the other typed arrays, for that matter, including Int8Array, Int16Array, and Int32Array), data is null.

It’s the same between Android 3.0 and 3.2