【问题标题】:How compatible is JavaFX Webview with Android's Webview?JavaFX Webview 与 Android 的 Webview 的兼容性如何?
【发布时间】:2016-04-14 01:47:25
【问题描述】:

我一直在尝试将使用 Netbeans 和 Gradle 的 JavaFX 项目移植到 Android APK 文件格式中,并且在大多数情况下它运行良好!我遇到的问题特别是 Android 的 WebView 组件?我可以让它在 Android Webview 中显示一个静态网页,而我的应用程序不会因致命异常而崩溃。但是如果我使用 JavaScript 在 JavaFX Webview 中创建动态网页,Androids Webview 似乎根本无法应对?

尽管在 JavaFX 中我将启用 JavaScript 设置为 true:

googleMapEngine.setJavaScriptEnabled(true);

据我所知,在 Android Webview 中,JavaScript 默认是关闭的。 我无法让它在 Android 中工作。另外,Android Webview是否知道如何解析JavaFX命令?

googleMapEngine.executeScript(String);

因为如果我尝试这个:

googleMapEngine.executeScript(
      "var latlng = new google.maps.LatLng(59.438722, 24.745278);" +
      "var myOptions = {" + 
           "zoom: 15," +
           "center: latlng," +
           "mapTypeId: google.maps.MapTypeId.ROADMAP," +
           "mapTypeControl: false," +
           "navigationControl: false," +
           "streetViewControl: false," +
           "backgroundColor: '#666970'," +
           "disableDefaultUI: true" +
      "};" +
      "" +
      "var map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);");

我最终在 logcat 中出现错误:

    I/System.out(  809): [JVDBG] Error firing event

W/System.err(  809): java.lang.ClassNotFoundException: com.sun.webkit.NativeWebView

W/System.err(  809):    at java.lang.Class.classForName(Native Method)

W/System.err(  809):    at java.lang.Class.forName(Class.java:309)

W/System.err(  809):    at com.oracle.dalvik.InternalWebView._fireLoadEvent(InternalWebView.java:347)

W/System.err(  809):    at com.oracle.dalvik.InternalWebView.fireLoadEvent(InternalWebView.java:140)

W/System.err(  809):    at com.oracle.dalvik.InternalWebView.access$400(InternalWebView.java:43)

W/System.err(  809):    at com.oracle.dalvik.InternalWebView$MyJavaScriptInterface.processHTML(InternalWebView.java:363)

W/System.err(  809):    at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)

W/System.err(  809):    at org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39)

W/System.err(  809):    at android.os.Handler.dispatchMessage(Handler.java:102)

W/System.err(  809):    at android.os.Looper.loop(Looper.java:145)

W/System.err(  809):    at android.os.HandlerThread.run(HandlerThread.java:61)

W/System.err(  809): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sun.webkit.NativeWebView" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

W/System.err(  809):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)

W/System.err(  809):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)

W/System.err(  809):    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)

W/System.err(  809):    ... 11 more

W/System.err(  809):    Suppressed: java.lang.ClassNotFoundException: com.sun.webkit.NativeWebView

W/System.err(  809):        at java.lang.Class.classForName(Native Method)

W/System.err(  809):        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)

W/System.err(  809):        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)

W/System.err(  809):        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)

W/System.err(  809):        ... 12 more

W/System.err(  809):    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

E/AndroidRuntime(  809): FATAL EXCEPTION: JavaFX Application Thread

E/AndroidRuntime(  809): Process: com.SundaeThePugApp, PID: 809

E/AndroidRuntime(  809): java.lang.UnsupportedOperationException: Not supported yet.

E/AndroidRuntime(  809):    at com.sun.webkit.WebPage.executeScript(WebPage.java:153)

E/AndroidRuntime(  809):    at javafx.scene.web.WebEngine.executeScript(WebEngine.java:860)

E/AndroidRuntime(  809):    at com.SundaeThePugApp.SundaeThePugController$1.changed(SundaeThePugController.java:202)

E/AndroidRuntime(  809):    at com.SundaeThePugApp.SundaeThePugController$1.changed(SundaeThePugController.java:200)

E/AndroidRuntime(  809):    at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)

E/AndroidRuntime(  809):    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)

E/AndroidRuntime(  809):    at javafx.beans.property.ReadOnlyObjectWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyObjectWrapper.java:176)

E/AndroidRuntime(  809):    at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:142)

E/AndroidRuntime(  809):    at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)

E/AndroidRuntime(  809):    at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146)

E/AndroidRuntime(  809):    at javafx.scene.web.WebEngine$LoadWorker.updateState(WebEngine.java:1023)

E/AndroidRuntime(  809):    at javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1134)

E/AndroidRuntime(  809):    at javafx.scene.web.WebEngine$LoadWorker.access$1000(WebEngine.java:1016)

E/AndroidRuntime(  809):    at javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1003)

E/AndroidRuntime(  809):    at com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:251)

E/AndroidRuntime(  809):    at com.sun.webkit.NativeWebView$1.run(NativeWebView.java:100)

E/AndroidRuntime(  809):    at com.sun.javafx.application.PlatformImpl.lambda$null$155(PlatformImpl.java:295)

E/AndroidRuntime(  809):    at com.sun.javafx.application.PlatformImpl.access$lambda$18(PlatformImpl.java)

E/AndroidRuntime(  809):    at com.sun.javafx.application.PlatformImpl$$Lambda$19.run(Unknown Source)

E/AndroidRuntime(  809):    at java.security.AccessController.doPrivileged(AccessController.java:52)

E/AndroidRuntime(  809):    at com.sun.javafx.application.PlatformImpl.lambda$runLater$156(PlatformImpl.java:294)

E/AndroidRuntime(  809):    at com.sun.javafx.application.PlatformImpl.access$lambda$5(PlatformImpl.java)

E/AndroidRuntime(  809):    at com.sun.javafx.application.PlatformImpl$$Lambda$6.run(Unknown Source)

E/AndroidRuntime(  809):    at com.sun.glass.ui.monocle.RunnableProcessor.runLoop(RunnableProcessor.java:92)

E/AndroidRuntime(  809):    at com.sun.glass.ui.monocle.RunnableProcessor.run(RunnableProcessor.java:51)

E/AndroidRuntime(  809):    at java.lang.Thread.run(Thread.java:818)

V/ApplicationPolicy( 3468): isApplicationStateBlocked userId 0 pkgname com.SundaeThePugApp

V/ApplicationPolicy( 3468): isApplicationStateBlocked userId 0 pkgname com.SundaeThePugApp

V/ApplicationPolicy( 3468): isApplicationStateBlocked userId 0 pkgname com.sec.android.app.launcher

欢迎所有反馈:)

【问题讨论】:

  • Java.lang.ClassNotFoundException: com.sun.webkit.NativeWebView 这意味着您的项目中没有此类,这意味着您需要导入与之关联的 jar。希望这有助于您走上正轨,因为我不确定您的其他问题是什么。

标签: javascript android javafx webview apk


【解决方案1】:

经过多次尝试和错误后,我得出的结论是 JavaFXPorts 总体上非常好,但它们有一些警告:

1) 您的应用目前无法使用媒体和音频功能,因为它会引发致命异常

2) Webview 仅限于呈现 javascript 网站。

我会解释,如果我使用:

googleMapEngine.load("http://fxexperience.com/");

完美,一切正常,页面渲染正确。

但如果我这样做:

googleMapEngine.setJavaScriptEnabled(true);    
googleMapEngine.load("https://www.openstreetmap.org/");

我得到 NO 地图,我在我的应用程序中只能看到打开的街道地图徽标和一个菜单按钮,否则 web 视图的其余部分是白色的!此外,在 JavaFX 中启用 JavaScript 似乎对 Android 的 webview 没有影响,而将 Android 的默认设置设为 false!

如果我做最简单的谷歌地图网址呢:

googleMapEngine.setJavaScriptEnabled(true);    
googleMapEngine.load("https://www.google.com/maps/");

我得到什么都没有,只是一个白屏!此外,在 JavaFX 中启用 JavaScript 似乎对 Android 的 webview 没有影响,而将 Android 的默认设置设为 false!

如果我用正确的路径创建一个本地 html 文件:

googleMapEngine.setJavaScriptEnabled(true);
googleMapEngine.load(getClass().getClassLoader().getResource("googleLondonMap.html").toExternalForm());

我在 Android 网络视图中收到 net::ERR_UNKNOWN_URL_SCHEME

最后,作为 Androids Webview 的默认 javascript 设置设置为 false。这意味着如果您尝试使用 JavaFX 语句:

googleMapEngine.executeScript(foo());

这会在您的 Android 应用中导致 FATAL EXCEPTION。如果 Johan Vos 和 Co 能够通过未来更新他们在 JavaFXPorts 上的出色工作来克服这些 Android WebView 移植问题,那就太好了!

【讨论】:

  • 感谢您的报告。我们已经提交了一个问题,以了解为什么 executeScript() 在 Android 上失败。与此同时,您可以看看这个 post 作为不需要 WebView 或 JavaScript 的替代方案。
  • 感谢 Jose 就此事提供的帮助以及您发布的链接。我会看看这个。此外,我认为应该提出一个问题,说明为什么 webEngine.setJavaScriptEnabled(true); 无法正常工作或对 Android 的 webview 产生预期的效果。
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2020-09-22
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多