AFAIK нет «вне коробки» решение для этого для JSV8.
Но посмотрим на следующем примере:
public class V8ConsoleBridge implements JavaVoidCallback {
@Override
public void invoke(V8Object receiver, V8Array parameters) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < parameters.length(); ++i) {
if (i > 0) {
sb.append(", ");
}
Object object = parameters.get(i);
if (object instanceof V8Object) {
V8Object v8Object = (V8Object) object;
sb.append(v8Object.toString());
v8Object.release();
} else {
sb.append(object);
}
}
Log.i("goebl-v8", sb.toString());
}
public static void register(V8 v8) {
V8ConsoleBridge console = new V8ConsoleBridge();
V8Object v8Console = new V8Object(v8);
v8.add("console", v8Console);
v8Console.registerJavaMethod(console, "debug");
v8Console.registerJavaMethod(console, "log");
v8Console.registerJavaMethod(console, "info");
v8Console.registerJavaMethod(console, "warn");
v8Console.registerJavaMethod(console, "error");
v8Console.release();
}
}
Это является жёстко мост для объекта JS console
для доступа к системе Android протоколирования.
Вы могли бы написать общий код для
- отсканировать класс, который вы хотите выставить в JavaScript, так же, как JavaScript-интерфейс для WebView, даже с аннотациями, как
@JavascriptInterface
включать только некоторые члены
- написать общий код для
invoke
, который фактически вызывает элементы класса приемника, используя отражение Java.
Конечно, было бы здорово, если бы у J2V8 был этот полезный код, потому что он мог бы использоваться многими проектами. Когда у вас есть твердое решение, создайте запрос на растяжение, чтобы я мог его использовать :-)
Если вы не против углубляться в исходный код, вам может оказаться полезным проверить NativeScript. Они предоставляют общий способ доступа ко всем классам Java, известным во время компиляции в JavaScript, который внутренне выполняется путем отражения. Ну, я слышал, что они делают это так, я на самом деле не читал исходный код NativeScript. В NativeScript вам не нужно создавать мосты, это сделано магически с помощью системы build-and runtime-system. Возможно, источник вдохновляет вас на перенос идей на J2V8.
Да, как автор J2V8, я могу подтвердить, что нет доступного для всех классов Java никакого готового способа. С J2V8 вы указываете, какие классы вы хотите открыть. Но я думаю, что это можно было бы построить, и я был бы рад рассмотреть запросы на получение этого. – irbull