2016-06-06 5 views
2

Мы пытаемся заменить наш webview и html файлом макета и каким-то механизмом javascript. Существует TON javascript, который нужно вызвать, и у нас есть довольно большой JavaScript-интерфейс, который должен быть доступен JS-движку. Я пробовал Rhino и J2V8, но не могу понять, как предоставить javascript доступ к полному классу методов или аннотации, которая работает аналогично тому, как вы комментируете методы для WebView.Android Javascript Engine; Необходимо заменить WebView на Rhino, J2V8 и т. Д.

Если у кого-нибудь есть понимание, было бы очень признательно!

Спасибо, Jon

ответ

2

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.

+1

Да, как автор J2V8, я могу подтвердить, что нет доступного для всех классов Java никакого готового способа. С J2V8 вы указываете, какие классы вы хотите открыть. Но я думаю, что это можно было бы построить, и я был бы рад рассмотреть запросы на получение этого. – irbull