2016-06-06 8 views
2

우리는 webview와 html을 레이아웃 파일과 일종의 javascript 엔진으로 대체하려고합니다. 호출해야하는 Javascript가 많으며 JS 엔진이 액세스 할 수 있어야하는 다소 큰 JavaScriptInterface가 있습니다. Rhino와 J2V8을 사용해 보았지만 자바 스크립트에 메소드의 전체 클래스 또는 WebView의 메소드에 주석을 추가하는 것과 비슷한 방식으로 작동하는 주석을 제공하는 방법을 찾아 낼 수 없습니다.Android Javascript 엔진; Rhino, J2V8 등으로 WebView를 대체해야합니다.

누군가 통찰력을 가지고 있다면, 매우 감사하겠습니다!

덕분에, 존

답변

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 객체에 대한 하드 코딩 된 다리입니다 :

그러나 다음의 예를 보라.

심지어 단지에 @JavascriptInterface 같은 주석으로, 당신은 많은 웹보기를위한 자바 스크립트 인터페이스와 같은 자바 스크립트에 노출 할 클래스를 스캔

  • 에 일반적인 코드를 작성할 수는
  • 은 일반적인 코드를 작성
  • 특정 구성원을 포함 실제로는 Java 리플렉션을 사용하여 수신자 클래스의 멤버를 호출하는 invoke입니다.

많은 프로젝트에서 J2V8이이 유용한 코드를 사용하면 물론 좋을 것입니다. 솔리드 솔루션을 사용할 때는 풀 요청을 만들어서 사용할 수도 있습니다 :-)

소스 코드가 깊숙이 들어가도 괜찮 으면 NativeScript을 확인하는 것이 좋습니다. 그것들은 내부적으로 리플렉션을 통해 수행되는 자바 스크립트에서 컴파일 타임에 알려진 모든 Java 클래스에 액세스하는 일반적인 방법을 제공합니다. 글쎄, 나는 그들이 NativeScript의 소스 코드를 읽지 않았다는 것을 들었습니다. NativeScript에서는 브릿지를 만들 필요가 없으며 빌드 및 런타임 시스템에서 마술처럼 사용됩니다. 어쩌면 소스가 J2V8로 아이디어를 포팅하도록 자극 할 수 있습니다.

+1

예, J2V8의 작성자로서 모든 Java 클래스에 액세스 할 수있는 기본 방법이 없음을 확인할 수 있습니다. J2V8에서는 공개 할 클래스를 지정합니다. 그러나 이것이 구축 될 수 있다고 생각합니다. 이에 대한 요청을 검토해 드리겠습니다. – irbull