Является ли привязка Java JNI JavaScript эффективно передавать TypedArray/ArrayBuffer в Java в виде массива?

В привязке JNI для Android вы можете выставить Java-метод, такой как method(int[] intArray) {}, на JavaScript, передать ему массив JavaScript и ожидать привязки для преобразования этого массива JavaScript в int[]. Имеет ли Android ту же самую обработку, например, Uint8Array()?

Ответ 1

Механизм JavaScript, который работает в Android WebView, не поддерживает Uint8Arrays или любые другие типизированные массивы (начиная с 2.3.3).

EDIT: я провел еще несколько тестов с симуляторами, и у меня есть смешанные вещи, чтобы сообщить.

С положительной стороны механизм JavaScript в Android 3.x WebView поддерживает типизированные массивы, за исключением Float64Array.

На минусовой стороне интерфейс JNI для Java через WebView.addJavascriptInterface() не преобразует типы вообще. Это код, который я использовал для его проверки:

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

И функция Java для android.log() выглядит в основном так:

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

Когда я вызывал android.log со стандартным объектом JavaScript типа Array(), я бы получил результаты, которые можно было бы ожидать (массив привязан к данным, преобразованию типа и т.д.). Когда был вызван android.log с Объект Uint8Array (или любой другой типизированный массив, если на то пошло, включая Int8Array, Int16Array и Int32Array), данные являются нулевыми.

То же самое и между Android 3.0 и 3.2