Apache Felix - 使用捆绑服务显示“java.lang.ClassCastException”

时间:2013-08-19 12:45:14

标签: android casting osgi apache-felix osgi-bundle

我将Apache Felix嵌入到Android应用程序中。在该应用程序中,我正在尝试使用捆绑提供的服务。捆绑包已成功安装并启动,但在使用该服务的行:

 System.out.println( ((AndroidService) services [0]).startActivity());

我收到以下错误:

 java.lang.ClassCastException: androidapi_bundle.AndroidServiceImpl cannot be cast to com.example.android_services.AndroidService

我的捆绑包中有以下内容:

1- Activator class

package androidapi_bundle;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.example.android_services.AndroidService;
import android.util.Log;


public class Activator implements BundleActivator {

    private static BundleContext context;

    static BundleContext getContext() {
        return context;
    }


    public void start(BundleContext bundleContext) throws Exception {
        Activator.context = bundleContext;

        System.out.println("This is a java message inside the start method of AndroidAPI_Bundle");
        Log.d("Zitona Log","This is android message inside the start method of AndroidAPI_Bundle");


        context.registerService(
                AndroidService.class.getName(), new AndroidServiceImpl(),null);
    }


    public void stop(BundleContext bundleContext) throws Exception {
        Activator.context = null;

        Log.d("Zitona Log","AndroidAPI_Bundle stopped!");
    }

}

2- com.example.android_services,其中包含AndroidService.java接口:

package com.example.android_services;

public interface AndroidService {

    public String startActivity();


}

3-其实施班级AndroidServiceImpl.java

package androidapi_bundle;

import com.example.android_services.*;

public class AndroidServiceImpl implements AndroidService {

    @Override
    public String startActivity()
    {
        return "Activity started";

    }


}

现在,在我的Android应用程序中,我还有AndroidService.java接口,以下是使用该服务的代码:

@SuppressWarnings({ "rawtypes", "unchecked" })

ServiceTracker m_tracker = new ServiceTracker(
        m_activator.getContext(),AndroidService.class.getName(), null);

    m_tracker.open();

    System.out.println("8");

    Object[] services = m_tracker.getServices();

    System.out.println("9");
    System.out.println( ((AndroidService) services [0]).startActivity());


   System.out.println("10");

显示“9”后出现错误。我哪里出错了?

以下是我的包裹MANIFEST:

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

更新

我意识到我有这行代码:

   m_configMap.put(FelixConstants.FRAMEWORK_SYSTEMCAPABILITIES_EXTRA, "com.example.android_services");

所以我改成了:

    m_configMap.put(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "com.example.android_services");

现在我收到了这个错误:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.apache_felix_android/com.example.apache_felix_android.MainActivity}: java.lang.NullPointerException

1 个答案:

答案 0 :(得分:-1)

唯一可以获得此功能的方法是,如果激活器捆绑包和应用程序包都具有服务类的内部副本,并且都不会将其导出。因此,您需要显示清单并捆绑内容。

更新当您遇到非常基本的问题时,您究竟在使用系统包等高级选项(然后使用Felix类而不是OSGi的常量类)。为什么不从干净的简单bndtools开始,使用IDE让你的应用程序在那里工作,然后当它工作时将它移植到Android?这一切看起来都是非常自虐的学习OSGi的方法吗?