2011-05-17 50 views
2

內運行,我不能弄清楚爲什麼會發生以下情況:嵌入式菲利克斯,Android的應用程序着決心org.osgi.framework

我正在從一個小小的Android應用程序的嵌入式Apache的菲利克斯。我以編程方式在啓動框架後安裝2個捆綁包,但都不會進入「已解決」狀態。因此Bundle「MyBundle1」導入「MyBundle2」。

這是logcat的告訴我:

05-17 20:21:56.514: ERROR/MainActivity(384): org.osgi.framework.BundleException:  
Unresolved constraint in bundle de.xy.MyBundle1 [1]: Unable to resolve 1.11: missing 
requirement [1.11] package; (package=de.xy.MyBundle2) [caused by: Unable to resolve 2.0: 
missing requirement [2.0] package; (&(package=org.osgi.framework)(version>=1.5.0))]  

我完全理解什麼錯誤消息說(嗯... org.osgi.framework在1.5+版本不能得到解決),但我找不出爲什麼會發生。爲什麼框架不能解決「他自己」?我試圖運行相同的felix.jar作爲獨立的adb外殼,並且這兩個軟件包都能正常工作。當然,felix.jar是最新的(3.2)

感謝您的建議!

丹尼爾

FelixSetup

m_configMap = new StringMap(false); 
    try { 
     m_cache = File.createTempFile("felix-cache", null); 
    } catch (IOException ex) { 
     throw new IllegalStateException(ex); 
    } 
    m_cache.delete(); 
    boolean mkdirs = m_cache.mkdirs(); // works (=true) 
    m_activator = new HostActivator(); // implements BundleActivator 
    List list = new ArrayList(); 
    list.add(m_activator); 
    m_configMap.put(FelixConstants.LOG_LEVEL_PROP, "1"); 
    m_configMap.put(BundleCache.CACHE_ROOTDIR_PROP, "."); 
    m_configMap.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list); 
    m_configMap.put(FelixConstants.FRAMEWORK_STORAGE, m_cache.getAbsolutePath()); 
    m_felix = new Felix(m_configMap); 
    try { 
     m_felix.start(); 
    } catch (BundleException ex) { 
     Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex); 
    } 

我不知道是否有事情做與以前的問題:我安裝

05-18 08:52:59.149: VERBOSE/out(363): Problem creating boot delegation class loader:  java.lang.reflect.InvocationTargetException 
05-18 08:52:59.209: VERBOSE/out(363): ERROR: Error parsing system bundle export statement: (java.lang.IllegalArgumentException:A header cannot be an empty string.) 

05-18 08:52:59.209: VERBOSE/out(363): java.lang.IllegalArgumentException: A header cannot be an empty string. 

myBundle1= bundleContext.installBundle("file:/data/felix/MyBundle1.jar"); 
myBundle2= bundleContext.installBundle("file:/data/felix/MyBundle2.jar"); 

myBundle1.start(); 
啓動包

他們先前被dx'ed並移動到/ data/felix與adb push

我在android應用程序中使用的相同代碼也適用於常規的java控制檯應用程序。

+0

我忘了提及:即使我從兩個bundle的import-package指令中刪除了「version」,它也不能被解析 – 2011-05-17 20:48:03

+0

你能展示設置並啓動框架的代碼嗎?另外,你的嵌入代碼是否在'常規'java上工作? – 2011-05-17 22:08:45

+0

不錯的建議,我試了一個創建的控制檯應用程序,使用相同的代碼來啓動框架,相同的捆綁包(felix.jar,MyBundle1.jar,MyBundle2.jar),它就像一個魅力。 – 2011-05-18 09:20:30

回答

2

你建立框架的方式對我來說看起來沒問題。您可以考慮使用

  • 將特定於Android的列表替換爲FRAMEWORK_SYSTEMPACKAGES,使用活動)或
  • 不使用臨時文件,但指向您知道存在的某個目錄。

我們已經在過去的3.0.1版本中成功使用過,而且我確實有這樣的想法,即您發佈的錯誤消息與它有關。你可以試試Felix的這個版本,如果這個版本有效,你可能會在Felix中找到一個迴歸,然後你可以報告給[email protected]

+0

*用特定於Android *的列表替換FRAMEWORK_SYSTEMPACKAGES,幫助 - 最後!非常感謝。 – 2011-05-19 12:31:56