Fix issue Felix-1156.
Allow Felix to run on a regular Android phone (Android 1.5).
This is possible by using the loadDex method of the android.dalvik.DexFile class.
So, the resulting framework runs on Android 1.5.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@774881 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java b/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java
index c5824ce..19171dc 100644
--- a/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/searchpolicy/ModuleImpl.java
@@ -1383,11 +1383,13 @@
}
private static final Constructor m_dexFileClassConstructor;
+ private static final Method m_dexFileClassLoadDex;
private static final Method m_dexFileClassLoadClass;
static
{
Constructor dexFileClassConstructor = null;
+ Method dexFileClassLoadDex = null;
Method dexFileClassLoadClass = null;
try
{
@@ -1401,6 +1403,15 @@
dexFileClass = Class.forName("android.dalvik.DexFile");
}
+ try
+ {
+ dexFileClassLoadDex = dexFileClass.getMethod("loadDex",
+ new Class[]{String.class, String.class, Integer.TYPE});
+ }
+ catch (Exception ex)
+ {
+ // Nothing we need to do
+ }
dexFileClassConstructor = dexFileClass.getConstructor(
new Class[] { java.io.File.class });
dexFileClassLoadClass = dexFileClass.getMethod("loadClass",
@@ -1409,9 +1420,11 @@
catch (Exception ex)
{
dexFileClassConstructor = null;
+ dexFileClassLoadDex = null;
dexFileClassLoadClass = null;
}
m_dexFileClassConstructor = dexFileClassConstructor;
+ m_dexFileClassLoadDex= dexFileClassLoadDex;
m_dexFileClassLoadClass = dexFileClassLoadClass;
}
@@ -1421,7 +1434,7 @@
public ModuleClassLoader()
{
- if (m_dexFileClassConstructor != null)
+ if (m_dexFileClassLoadClass != null)
{
m_jarContentToDexFile = new HashMap();
}
@@ -1613,8 +1626,17 @@
{
try
{
- dexFile = m_dexFileClassConstructor.newInstance(
- new Object[] { content.getFile() });
+ if (m_dexFileClassLoadDex != null)
+ {
+ dexFile = m_dexFileClassLoadDex.invoke(null,
+ new Object[]{content.getFile().getAbsolutePath(),
+ content.getFile().getAbsolutePath() + ".dex", new Integer(0)});
+ }
+ else
+ {
+ dexFile = m_dexFileClassConstructor.newInstance(
+ new Object[] { content.getFile() });
+ }
}
finally
{