Android中的Knoflerfish-bundle启动失败



我遵循本教程将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)

这个bundle是来自Knopflerfish示例源的示例bundle。安装在Knopflerfish destop(framework.jar)中时效果良好

我已经想到了dex,但合并jar文件和它的dex文件是没有用的,它仍然不起作用。

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

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

首先,这个问题与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());

希望得到帮助。

最新更新