Пакет OSGI с использованием API Android показывает ошибку java.lang.NoClassDefFoundError

В моем проекте плагина eclipse я пытаюсь использовать Android API.

Первое, что я сделал, это добавил Android.jar к пути сборки. Затем я попытался отобразить сообщение как на консоли (используя System.out.println()), так и на LogCat (используя android/util.Log). Я показываю эти сообщения в моем методе start() класса Bundle Activator.

Я также экспортировал и импортировал пакет android.util в свой файл MANIFEST.MF.

Когда я запускаю пакет, я вижу первое сообщение в своей консоли, но после этого я получаю следующие ошибки:

!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

Я пытался найти похожие ситуации, но нашел их без ответа. Например, здесь в 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), он вообще ничего не показывает. Поэтому я подумал, что сначала должен исправить вышеуказанные ошибки, чтобы увидеть сообщение в журнале.


person Traveling Salesman    schedule 11.08.2013    source источник
comment
Почему вы экспортируете пакет android.util? Является ли этот пакет физически частью вашего пакета? Или экспортируется другой связкой (или системной связкой)?   -  person Neil Bartlett    schedule 11.08.2013
comment
Я экспортирую его, потому что, когда я этого не делаю, я получаю сообщение «Нет доступных пакетов экспорта» «android.util» в строке «Я импортирую». Когда я экспортирую его, эта ошибка исчезла. Я не понял, что именно вы подразумеваете под физической частью пакета, но нет, он не экспортируется никаким другим пакетом.   -  person Traveling Salesman    schedule 11.08.2013
comment
Если пакета нет в вашем комплекте, вы не можете его экспортировать. Это просто.   -  person Neil Bartlett    schedule 12.08.2013


Ответы (2)


Я не знаком с andriod, но могу прокомментировать с точки зрения OSGi. Неправильно экспортировать android.util, поскольку в вашем комплекте нет этого класса.

Вместо этого вам нужно подготовить файл android.jar как еще один пакет OSGi, поскольку в этом файле есть этот пакет, и добавить его в среду выполнения OSGi. Недостаточно добавить его в путь сборки.

person sjlee    schedule 11.08.2013
comment
Хорошо, я подготовил android.jar в виде пакета. Теперь я не мог понять, как открыть этот пакет в eclipse, чтобы экспортировать пакеты. Вы можете помочь? - person Traveling Salesman; 11.08.2013
comment
хорошо, я создал пакет Android в eclipse по этой ссылке: stackoverflow.com/questions/9819090/ В этом пакете я экспортировал android.util Теперь мой исходный пакет импортирует только android.util, (убрал экспорт android.util). Ведь когда я запускаю свой оригинальный бандл, то получаю новые приятные ошибки, часть из них я покажу в следующем комментарии. - person Traveling Salesman; 11.08.2013
comment
Вызвано: java.lang.RuntimeException: Stub! в 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(собственный метод) в 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) в ....... - person Traveling Salesman; 11.08.2013
comment
Ну, по крайней мере, это указывает на то, что ваш пакет теперь правильно подключен к пакету andriod из-за того, что был вызван метод android.util.Log.d(). Кроме того, я не уверен, что мне есть что добавить, поскольку я не знаком с кодом Android... - person sjlee; 12.08.2013
comment
Вы должны принять ответ @sjlee, потому что он устраняет проблему, указанную в вопросе. Если у вас есть дополнительный вопрос, задайте его отдельно. Во-первых, трассировка стека совершенно нечитаема, когда она публикуется в комментарии. - person Neil Bartlett; 12.08.2013

Вы можете обратиться к главе «Включить неграфический пакет Android» в моей теме. Даже если это нацелено на Knopflerfish, изменения должны быть применимы к другой реализации OSGi, если вы можете изменить ее.

Полная поддержка пакетов OSGi для Android

В то же время, я не против некоторой помощи по моей теме.

person slash33    schedule 03.09.2013