The implementation for launching a JavaFX application on Dalvik has changed a couple of times in the android-bitbucket repository. (i.e. allow more than 1 dex file, optimize startup performance)
The following patch incorporates these changes.
diff -r 9f5303fb78fb modules/graphics/src/dalvik/java/javafxports/android/DalvikLauncher.java
--- a/modules/graphics/src/dalvik/java/javafxports/android/DalvikLauncher.java Fri Jun 13 12:36:57 2014 +1200
+++ b/modules/graphics/src/dalvik/java/javafxports/android/DalvikLauncher.java Fri Jun 13 11:05:29 2014 +0200
@@ -27,10 +27,8 @@
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.content.res.AssetManager;
import android.util.Log;
import dalvik.system.DexClassLoader;
-import dalvik.system.PathClassLoader;
import java.io.BufferedInputStream;
import java.io.File;
@@ -65,7 +63,7 @@
this.activity = a;
this.preloaderClassName = preloaderClassName;
this.mainClassName = mainClassName;
-
+
InputStream is = null;
Properties userProperties = new Properties();
try {
@@ -81,10 +79,15 @@
System.getProperties().list(System.out);
} catch (IOException e) {
+ Log.v(TAG, "Can't load properties");
throw new RuntimeException("Can't load properties", e);
} finally {
- try { is.close(); } catch(Exception e) {}
-
+ try {
+ is.close();
+ } catch (Exception e) {
+ Log.v(TAG, "Exception closing properties InputStream");
+ }
+
}
Log.v(TAG, "Launch JavaFX application on dalvik vm.");
@@ -140,9 +143,9 @@
Log.e(TAG, "Launch failed with exception.", e);
}
}
-
+
private static ClassLoader applicationClassLoader;
-
+
private ClassLoader getApplicationClassLoader() {
if (applicationClassLoader == null) {
// Internal storage where the DexClassLoader writes the optimized dex file to.
@@ -150,11 +153,10 @@
// Initialize the class loader with the secondary dex file.
// This includes the javafx, compatibility and application classes
-
ClassLoader cl = new DexClassLoader(FXActivity.dexClassPath,
- optimizedDexOutputPath.getAbsolutePath(),
- FXActivity.getInstance().getApplicationInfo().nativeLibraryDir,
- activity.getClassLoader());
+ optimizedDexOutputPath.getAbsolutePath(),
+ FXActivity.getInstance().getApplicationInfo().nativeLibraryDir,
+ activity.getClassLoader());
Thread.currentThread().setContextClassLoader(cl);
applicationClassLoader = cl;
Log.v(TAG, "Application classloader initialized: " + applicationClassLoader);
@@ -171,7 +173,7 @@
FXActivity.getInstance().setOnSurfaceRedrawNeededNativeMethod(dalvikInputClass.getMethod("onSurfaceRedrawNeededNative"));
FXActivity.getInstance().setOnConfigurationChangedNativeMethod(dalvikInputClass.getMethod("onConfigurationChangedNative", int.class));
}
-
+
private Class resolveApplicationClass()
throws PackageManager.NameNotFoundException, ClassNotFoundException {
diff -r 9f5303fb78fb modules/graphics/src/dalvik/java/javafxports/android/FXActivity.java
--- a/modules/graphics/src/dalvik/java/javafxports/android/FXActivity.java Fri Jun 13 12:36:57 2014 +1200
+++ b/modules/graphics/src/dalvik/java/javafxports/android/FXActivity.java Fri Jun 13 11:05:29 2014 +0200
@@ -68,7 +68,8 @@
SurfaceHolder.Callback2 {
private static final String TAG = "FXActivity";
-
+ private static final String JFX_BUILD = "8udev";
+
private static final String ACTIVITY_LIB = "activity";
private static final String META_DATA_LAUNCHER_CLASS = "launcher.class";
private static final String DEFAULT_LAUNCHER_CLASS = "javafxports.android.DalvikLauncher";
@@ -133,7 +134,7 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- Log.v(TAG, "onCreate FXActivity");
+ Log.v(TAG, "onCreate called, using "+JFX_BUILD);
if (launcher != null) {
Log.v(TAG, "JavaFX application is already running");
return;
The following patch incorporates these changes.
diff -r 9f5303fb78fb modules/graphics/src/dalvik/java/javafxports/android/DalvikLauncher.java
--- a/modules/graphics/src/dalvik/java/javafxports/android/DalvikLauncher.java Fri Jun 13 12:36:57 2014 +1200
+++ b/modules/graphics/src/dalvik/java/javafxports/android/DalvikLauncher.java Fri Jun 13 11:05:29 2014 +0200
@@ -27,10 +27,8 @@
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.content.res.AssetManager;
import android.util.Log;
import dalvik.system.DexClassLoader;
-import dalvik.system.PathClassLoader;
import java.io.BufferedInputStream;
import java.io.File;
@@ -65,7 +63,7 @@
this.activity = a;
this.preloaderClassName = preloaderClassName;
this.mainClassName = mainClassName;
-
+
InputStream is = null;
Properties userProperties = new Properties();
try {
@@ -81,10 +79,15 @@
System.getProperties().list(System.out);
} catch (IOException e) {
+ Log.v(TAG, "Can't load properties");
throw new RuntimeException("Can't load properties", e);
} finally {
- try { is.close(); } catch(Exception e) {}
-
+ try {
+ is.close();
+ } catch (Exception e) {
+ Log.v(TAG, "Exception closing properties InputStream");
+ }
+
}
Log.v(TAG, "Launch JavaFX application on dalvik vm.");
@@ -140,9 +143,9 @@
Log.e(TAG, "Launch failed with exception.", e);
}
}
-
+
private static ClassLoader applicationClassLoader;
-
+
private ClassLoader getApplicationClassLoader() {
if (applicationClassLoader == null) {
// Internal storage where the DexClassLoader writes the optimized dex file to.
@@ -150,11 +153,10 @@
// Initialize the class loader with the secondary dex file.
// This includes the javafx, compatibility and application classes
-
ClassLoader cl = new DexClassLoader(FXActivity.dexClassPath,
- optimizedDexOutputPath.getAbsolutePath(),
- FXActivity.getInstance().getApplicationInfo().nativeLibraryDir,
- activity.getClassLoader());
+ optimizedDexOutputPath.getAbsolutePath(),
+ FXActivity.getInstance().getApplicationInfo().nativeLibraryDir,
+ activity.getClassLoader());
Thread.currentThread().setContextClassLoader(cl);
applicationClassLoader = cl;
Log.v(TAG, "Application classloader initialized: " + applicationClassLoader);
@@ -171,7 +173,7 @@
FXActivity.getInstance().setOnSurfaceRedrawNeededNativeMethod(dalvikInputClass.getMethod("onSurfaceRedrawNeededNative"));
FXActivity.getInstance().setOnConfigurationChangedNativeMethod(dalvikInputClass.getMethod("onConfigurationChangedNative", int.class));
}
-
+
private Class resolveApplicationClass()
throws PackageManager.NameNotFoundException, ClassNotFoundException {
diff -r 9f5303fb78fb modules/graphics/src/dalvik/java/javafxports/android/FXActivity.java
--- a/modules/graphics/src/dalvik/java/javafxports/android/FXActivity.java Fri Jun 13 12:36:57 2014 +1200
+++ b/modules/graphics/src/dalvik/java/javafxports/android/FXActivity.java Fri Jun 13 11:05:29 2014 +0200
@@ -68,7 +68,8 @@
SurfaceHolder.Callback2 {
private static final String TAG = "FXActivity";
-
+ private static final String JFX_BUILD = "8udev";
+
private static final String ACTIVITY_LIB = "activity";
private static final String META_DATA_LAUNCHER_CLASS = "launcher.class";
private static final String DEFAULT_LAUNCHER_CLASS = "javafxports.android.DalvikLauncher";
@@ -133,7 +134,7 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- Log.v(TAG, "onCreate FXActivity");
+ Log.v(TAG, "onCreate called, using "+JFX_BUILD);
if (launcher != null) {
Log.v(TAG, "JavaFX application is already running");
return;