我按照tutorial将OSGi嵌入到我的Android应用程序中。但是,在安装并启动一个bundle之后,它的状态变为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 examples source的示例捆绑包。安装在Knopflerfish destop(framework.jar)
时,它运行良好我已经想过了dex,但是将jar文件和它的dex文件合并没有用,它仍然无法正常工作。
这里有什么问题?非常感谢你!
答案 0 :(得分: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());
希望得到这个帮助。