简体   繁体   English

JavaFX Webview与Android的Webview的兼容性如何?

[英]How compatible is JavaFX Webview with Android's Webview?

I've been trying to port a JavaFX project using Netbeans and Gradle into an Android APK file format and for the most part it works well! 我一直在尝试将使用Netbeans和Gradle的JavaFX项目移植到Android APK文件格式中,并且在大多数情况下效果很好! The issue I'm having is with the WebView component of Android in particular? 我遇到的问题特别是与Android的WebView组件有关? I can get it to show a static webpage in Android Webview without my app falling over with a FATAL EXCEPTION. 我可以让它在Android Webview中显示静态网页,而我的应用程序不会因为致命异常而崩溃。 But if I create a dynamic webpage in JavaFX Webview using JavaScript, Androids Webview doesn't appear to cope at all? 但是,如果我使用JavaScript在JavaFX Webview中创建动态网页,那么Android Webview似乎根本无法应付?

Eventhough in JavaFX I set enable JavaScript to true: 尽管在JavaFX中,我将启用JavaScript设置为true:

googleMapEngine.setJavaScriptEnabled(true);

As I'm aware that in Android Webview - JavaScript is switched off by default. 据我了解,在Android Webview中-JavaScript默认情况下处于关闭状态。 I cannot get it to work in Android. 我无法在Android中使用它。 In addition, does Android Webview know how to resolve the JavaFX command? 此外,Android Webview是否知道如何解析JavaFX命令?

googleMapEngine.executeScript(String);

Cause if I try this: 原因如果我尝试这样:

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);");

I end up with error in logcat: 我最终在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

All feedback will be most welcomed :) 所有反馈都将受到欢迎:)

OK after much trial and errors I have come to the conclusion that JavaFXPorts on the whole is damn good, but their are some caveats: 经过大量的试验和错误,我可以得出结论,JavaFXPorts总体上是该死的,但是有一些警告:

1) Media and Audio capabilities are not possible with your app at present as it throws a Fatal Exception . 1)由于您的应用程式会引发致命异常 ,因此目前无法使用媒体和音频功能。

2) Webview is limited to rendering non javascript websites. 2)Webview仅限呈现 JavaScript网站。

I'll explain, if I use: 我会解释,如果我使用:

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

Perfect, everything works fine and the page is rendered properly. 完美,一切正常,页面正确呈现。

But if I do this: 但是,如果我这样做:

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

I get NO map and all I can see in my app is the open street map logo and a menu button, otherwise the rest of the webview is white! 没有地图,在我的应用程序中只能看到开放的街道地图徽标和菜单按钮,否则其余的Webview为白色! Also enabling JavaScript in JavaFX seems to have no effect on Androids webview leaving Androids default setting to false! 同样在JavaFX中启用JavaScript似乎对Android的webview 无效 ,而将Android的默认设置设置为false!

What about if I do the most simplest Google Map url possible: 如果我做了最简单的Google Map网址怎么办:

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

I get nothing but a white screen! 除了白色的屏幕,我什么也没有 Also enabling JavaScript in JavaFX seems to have no effect on Androids webview leaving Androids default setting to false! 同样在JavaFX中启用JavaScript似乎对Android的webview 无效 ,而将Android的默认设置设置为false!

if I do a local html file with its path correctly made: 如果我使用正确的路径制作本地html文件:

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

I receive a net::ERR_UNKNOWN_URL_SCHEME in the Android webview. 我在Android Web视图中收到一个net :: ERR_UNKNOWN_URL_SCHEME

Finally, as Androids Webview default javascript setting is set to false. 最后,作为Androids Webview的默认javascript设置被设置为false。 This means if ever you try to use JavaFX statement: 这意味着如果您尝试使用JavaFX语句:

googleMapEngine.executeScript(foo());

It will cause a FATAL EXCEPTION in your android app. 它将在您的android应用中导致致命异常 It would be sweet if Johan Vos and Co can overcome these Android WebView porting issues with future updates to their excellent work on JavaFXPorts! 如果Johan Vos和Co可以通过在JavaFXPorts上出色工作的未来更新来克服这些Android WebView移植问题,那就太好了!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM