0

我按照本教程将 OSGi 嵌入到我的 Android 应用程序中。然而,在安装和启动一个包之后,它的状态变成了 RESOLVED (4),而不是 ACTIVE (32),因为它必须是。当我尝试再次启动时,它会引发异常:

Bundle#1 start failed
java.lang.ClassNotFoundException: org.knopflerfish.tutorial.simplebundle.impl.Activator
org.knopflerfish.framework.BundleImpl.start0(BundleImpl.java:421)
org.knopflerfish.framework.BundleThread.run(BundleThread.java:145)

此捆绑包是来自Knopflerfish 示例源的示例捆绑包。安装在 Knopflerfish destop (framework.jar) 中时效果很好

已经想到了dex,但是合并jar文件和它的dex文件没有用,还是不行。

这里有什么问题?非常感谢!

4

1 回答 1

0

几天后,我找到了解决此问题的方法。我把它贴在这里给任何可能关心的人。

首先,这个问题与dex文件有关。找不到dex文件导致BundleClassLoader找不到Activator类。在执行 dx 和 aapt 命令后的 jar 文件中,*.dex 必须位于顶部路径中。您可以通过提取 jar 文件来检查这一点并查看。

bundler.jar
----META-INF
----org
----classes.dex

如果您的应用仍然无法运行,您需要考虑的另一点。在Android较新版本中,dex文件不能位于外部存储中(如这里解释http://developer.android.com/reference/dalvik/system/DexClassLoader.html),因此您需要修改设置org的代码.osgi.framework.storage 属性。

代替:

Map<String, String> fwprops = new Hashtable<String, String>();
fwprops.put("org.osgi.framework.storage", Environment.getExternalStorageDirectory().getAbsolutePath() + "/fwdir");

我用这个:

Map<String, String> fwprops = new Hashtable<String, String>();
File dexOutputDir = getDir("dex", 0);
fwprops.put("org.osgi.framework.storage", dexOutputDir.getAbsolutePath());

希望这有帮助。

于 2013-09-10T09:30:22.440 回答