我将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
答案 0 :(得分:-1)
唯一可以获得此功能的方法是,如果激活器捆绑包和应用程序包都具有服务类的内部副本,并且都不会将其导出。因此,您需要显示清单并捆绑内容。
更新当您遇到非常基本的问题时,您究竟在使用系统包等高级选项(然后使用Felix类而不是OSGi的常量类)。为什么不从干净的简单bndtools开始,使用IDE让你的应用程序在那里工作,然后当它工作时将它移植到Android?这一切看起来都是非常自虐的学习OSGi的方法吗?