2016-04-14 42 views
0

我一直在試圖將使用Netbeans和Gradle的JavaFX項目移植到Android APK文件格式中,並且大部分工作正常!我遇到的問題特別是Android的WebView組件?我可以讓它在Android Webview中顯示一個靜態網頁,而不會導致我的應用程序崩潰併發生致命異常。但是,如果我使用JavaScript在JavaFX Webview中創建動態網頁,那麼Android Webview看起來似乎無法應對?JavaFX Webview與Android Webview的兼容性如何?

Eventhough JavaFX中我設置啓用JavaScript爲true:

googleMapEngine.setJavaScriptEnabled(true); 

我所知,在Android的web視圖 - 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 

所有反饋意見將是最歡迎:)

+0

Java.lang.ClassNotFoundException:com.sun.webkit.NativeWebView 這意味着您沒有位於您的項目中的此類,這意味着您需要導入與其關聯的jar。希望這有助於你走上正軌,因爲我不確定你的其他問題是什麼。 – XaolingBao

回答

1

OK後多試驗和錯誤我得出的結論是,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()); 

我收到網:: ERR_UNKNOWN_URL_SCHEME在Android的WebView。

最後,由於Android的Webview默認JavaScript設置設置爲false。這意味着,如果你曾經嘗試使用JavaFX的聲明:

googleMapEngine.executeScript(foo()); 

這將導致致命異常在你的Android應用程序。如果Johan Vos和Co可以克服這些Android WebView移植問題以及將來更新他們在JavaFXPorts上的出色工作,那將是甜蜜的!

+0

感謝您的報告。我們已經提出了一個問題,以瞭解爲什麼'executeScript()'在Android上失敗。與此同時,您可以查看此[post](http://gluonhq.com/announcing-gluon-maps/)作爲不需要WebView或JavaScript的替代方案。 –

+0

感謝Jose在這個問題上的幫助以及您發佈的鏈接。我會看看這個。此外,我認爲應該提出一個問題,爲什麼'webEngine.setJavaScriptEnabled(true);'不能正常工作或對Android Web視圖產生期望的影響。 – zermatt