Skip to content

Commit fce6929

Browse files
authored
Improve android handling
* Do not load codegen class on android * Autodetect android version
1 parent a7488d5 commit fce6929

File tree

3 files changed

+24
-3
lines changed

3 files changed

+24
-3
lines changed

rhino/src/main/java/org/mozilla/javascript/Context.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2649,7 +2649,9 @@ private static void notifyDebugger_r(Context cx, DebuggableScript dscript, Strin
26492649
}
26502650

26512651
private static Class<?> codegenClass =
2652-
Kit.classOrNull("org.mozilla.javascript.optimizer.Codegen");
2652+
ScriptRuntime.androidApi > 0
2653+
? null
2654+
: Kit.classOrNull("org.mozilla.javascript.optimizer.Codegen");
26532655
private static Class<?> interpreterClass =
26542656
Kit.classOrNull("org.mozilla.javascript.Interpreter");
26552657

rhino/src/main/java/org/mozilla/javascript/NativeJavaClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public Scriptable construct(Context cx, Scriptable scope, Object[] args) {
156156
try {
157157
// When running on Android create an InterfaceAdapter since our
158158
// bytecode generation won't work on Dalvik VM.
159-
if ("Dalvik".equals(System.getProperty("java.vm.name")) && classObject.isInterface()) {
159+
if (ScriptRuntime.androidApi > 0 && classObject.isInterface()) {
160160
Object obj =
161161
createInterfaceAdapter(
162162
classObject, ScriptableObject.ensureScriptableObject(args[0]));

rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.io.Serializable;
1010
import java.lang.reflect.Constructor;
11+
import java.lang.reflect.Field;
1112
import java.math.BigDecimal;
1213
import java.math.BigInteger;
1314
import java.math.MathContext;
@@ -297,7 +298,7 @@ public static ScriptableObject initStandardObjects(
297298

298299
static String[] getTopPackageNames() {
299300
// Include "android" top package if running on Android
300-
return "Dalvik".equals(System.getProperty("java.vm.name"))
301+
return androidApi > 0
301302
? new String[] {"java", "javax", "org", "com", "edu", "net", "android"}
302303
: new String[] {"java", "javax", "org", "com", "edu", "net"};
303304
}
@@ -6137,9 +6138,27 @@ public Object call(Context cx, Scriptable scope, Object[] args) {
61376138
}
61386139
}
61396140

6141+
private static int detectAndroidApi() {
6142+
6143+
try {
6144+
Class<?> versionClass = Class.forName("android.os.Build$VERSION");
6145+
Field sdkInt = versionClass.getField("SDK_INT");
6146+
return sdkInt.getInt(null);
6147+
} catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException e) {
6148+
if ("Dalvik".equals(System.getProperty("java.vm.name"))) {
6149+
// Fall back to vm-name
6150+
return 1;
6151+
}
6152+
}
6153+
return -1;
6154+
}
6155+
61406156
public static final Object[] emptyArgs = new Object[0];
61416157
public static final String[] emptyStrings = new String[0];
61426158

61436159
static final XMLLoader xmlLoaderImpl =
61446160
ScriptRuntime.loadOneServiceImplementation(XMLLoader.class);
6161+
6162+
/** This value holds the current android API version (or -1) if not running on android */
6163+
static final int androidApi = detectAndroidApi();
61456164
}

0 commit comments

Comments
 (0)