【问题标题】:OSGI Bundle using Android API is showing "java.lang.NoClassDefFoundError" error使用 Android API 的 OSGI Bundle 显示“java.lang.NoClassDefFoundError”错误
【发布时间】:2013-08-12 16:23:45
【问题描述】:

在我的 Eclipse 插件项目中,我正在尝试使用 Android API。

我做的第一件事是将Android.jar 添加到构建路径中。然后,我尝试在控制台(使用System.out.println())和LogCat(使用android/util.Log)上显示一条消息。我在 Bundle Activator 类的 start() 方法中显示这些消息。

我还在我的MANIFEST.MF 文件中导出和导入了android.util 包。

当我运行捆绑包时,我在控制台上看到第一条消息,但之后出现以下错误:

!ENTRY OSGI_Android_Bundle 4 0 2013-08-11 07:54:56.008
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Exception in osgi_android_bundle.Activator.start() of bundle OSGI_Android_Bundle.
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390)
    at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1177)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
Caused by: java.lang.NoClassDefFoundError: android/util/Log
    at osgi_android_bundle.Activator.start(Activator.java:27)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
    ... 12 more
Caused by: java.lang.ClassNotFoundException: android.util.Log
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 16 more
Root exception:
java.lang.NoClassDefFoundError: android/util/Log
    at osgi_android_bundle.Activator.start(Activator.java:27)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390)
    at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1177)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
Caused by: java.lang.ClassNotFoundException: android.util.Log
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 16 more

我试图搜索类似的情况,但没有得到答案。例如 here 在 stackoveflow。

有人可以帮忙吗?以下是我的代码:

package osgi_android_bundle;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;


import android.util.Log;

public class Activator implements BundleActivator {

    private static BundleContext context;

    static BundleContext getContext() {
        return context;
    }

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
     */
    public void start(BundleContext bundleContext) throws Exception {
        Activator.context = bundleContext;


        System.out.println("Hello World. I am the OSGI_Android_Bundle!");

        Log.d("Zaid Log", "Hello World. I am the OSGI_Android_Bundle!!");
    }

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
     */
    public void stop(BundleContext bundleContext) throws Exception {
        Activator.context = null;


        System.out.println("Goodbye World. I am the OSGI_Android_Bundle!");

        Log.d("Zaid Log", "Goodbye World. I am the OSGI_Android_Bundle!!");
    }

}

还有我的 MANIFEST.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: OSGI_Android_Bundle
Bundle-SymbolicName: OSGI_Android_Bundle
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: osgi_android_bundle.Activator
Import-Package: org.osgi.framework;version="1.3.0", android.util
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Export-Package: android.util

注意:当我在我的 Android 应用(嵌入了 Knopflerfish 平台)中启动这个包时,它根本不显示任何内容。所以我想我应该先修复上述错误,以便在日志中看到消息。

【问题讨论】:

  • 为什么要导出android.util 包?该软件包是您捆绑包的物理部分吗?还是由另一个包(或系统包)导出的?
  • 我导出它是因为当我不这样做时,我会在导入它的那一行得到“No available bundle exports package 'android.util'”。当我导出它时,这个错误就消失了。我不明白你所说的捆绑包的物理部分到底是什么意思,但是不,它不是由任何其他捆绑包导出的。
  • 如果包不在您的包中中,您将无法导出它。就是这样。

标签: android osgi bundle osgi-bundle


【解决方案1】:

您可以参考我的主题中的“启用非图形android bundle”一章。即使它是针对 Knopflerfish 的,只要您可以修改它,这些更改也应该适用于另一个 OSGi 实现。

Full Android support for OSGi bundles

同时,我不介意对我的主题有所帮助。

【讨论】:

    【解决方案2】:

    我不熟悉 andriod,但我可以从 OSGi 的角度发表评论。你导出 android.util 是不正确的,因为你的包没有那个类。

    相反,您需要将 android.jar 准备为另一个 OSGi 包,因为该 jar 确实具有该包并将其添加到 OSGi 运行时。将其添加到构建路径是不够的。

    【讨论】:

    • 好的,我准备了 android.jar 作为一个包。现在我不知道如何在 Eclipse 中打开该包,以便导出包。你能帮忙吗?
    • 好的,我在 Eclipse 中创建了 android 包,点击以下链接:stackoverflow.com/questions/9819090/… 在那个包中,我导出了 android.util 现在我的原始包只导入了 android.util,(我删除了导出 android .util)。毕竟,当我运行我的原始包时,我得到了新的不错的错误,我将在下一条评论中展示其中的一部分。
    • 引起:java.lang.RuntimeException:存根!在 android.util.Log.d(Log.java:7) 在 osgi_android_bundle.Activator.start(Activator.java:27) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java: 711) 在 java.security.AccessController.doPrivileged(Native Method) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) ... 9 更多根异常:java.lang.RuntimeException : 存根!在 android.util.Log.d(Log.java:7) 在 osgi_android_bundle.Activator.start(Activator.java:27) 在 .......
    • 好吧,至少它表明您的包现在已正确连接到 Android 包,因为调用了 android.util.Log.d() 方法。除此之外,我不确定我是否有什么要补充的,因为我不熟悉 android 代码...
    • 您应该接受@sjlee 的回答,因为它确实解决了问题中报告的问题。如果您有补充问题,请单独提出。一方面,堆栈跟踪在评论中发布时完全不可读。
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2019-05-01
    • 2013-11-24
    • 2014-05-27
    • 2013-03-10
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多