使用安卓 API 的bundle显示"java.lang.UnsatisfiedLinkError: android.util.Log.println_native"



我有一个OSGI Bundle,它是一个eclipse插件项目。在这个捆绑包中,我试图使用android API在LogCat上打印消息。在这两个问题1,2中,我被引导实现这一点的方法是获得Android API的真实实现,并将其准备为导出android.util的单独捆绑包,以便我的捆绑包导入android.util并使用它。好吧,我完成了所有这些步骤。我使用了这个android源代码,下面是我的捆绑包的Activator类:

package bundle_androidapi;
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!!");
    }
}

在使用Log.d()的行中,我得到以下错误:

!ENTRY Bundle_AndroidAPI 4 0 2013-08-14 15:10:53.638
!MESSAGE FrameworkEvent ERROR
!STACK 0
org.osgi.framework.BundleException: Exception in bundle_androidapi.Activator.start() of bundle Bundle_AndroidAPI.
    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.UnsatisfiedLinkError: android.util.Log.println_native(IILjava/lang/String;Ljava/lang/String;)I
    at android.util.Log.println_native(Native Method)
    at android.util.Log.d(Log.java:138)
    at bundle_androidapi.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
Root exception:
java.lang.UnsatisfiedLinkError: android.util.Log.println_native(IILjava/lang/String;Ljava/lang/String;)I
    at android.util.Log.println_native(Native Method)
    at android.util.Log.d(Log.java:138)
    at bundle_androidapi.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)

有人能告诉我怎样才能消除上面的错误吗。

下面是我的MANIFEST.MF:

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

注意:从1周开始,我一直在尝试让我的捆绑包使用andrid API,但一直失败。我的目标不仅仅是打印日志消息,而是让我的捆绑包成功使用Android API,所以我遵循正确的方式吗?我不断失败并出现这些错误是有原因的吗?谢谢

请阅读UnsatisfiedLinkError的JavaDocs:"如果Java虚拟机找不到声明为native的方法的适当本地语言定义,则抛出。"

换句话说,捆绑包中缺少println_native方法的本机实现。此外,我注意到您没有一个Bundle-NativeCode头,如果存在的话,它将使OSGi能够找到本机代码。

更新

在评论线程中,我们一致认为,我们甚至不应该尝试部署包含此API的捆绑包,因为API已经由Android平台提供。因此,上述建议没有实际意义。

构建依赖关系与运行时依赖关系之间存在一些混淆。android.jar可以添加到项目build依赖项中,以便编译捆绑包,但它在运行时不执行任何异常抛出"Stub!"异常的操作。但是,这是可以的,因为在运行时不需要它。

最新更新