2

なぜ次のことが起こるのかわかりません:

小さなAndroidアプリケーションから組み込みのApache Felixを実行しています。フレームワークの起動後にプログラムで 2 つのバンドルをインストールしますが、どちらも「解決済み」状態にはなりません。これにより、バンドル「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))]     

エラーメッセージの内容は完全に理解しています(まあ...バージョン1.5以降のorg.osgi.frameworkは解決できません)が、なぜこれが起こるのかわかりません。フレームワークが「自分自身」を解決できないのはなぜですか?! 同じ felix.jar を adb shell でスタンドアロンとして実行しようとしましたが、両方のバンドルが機能します。もちろん、felix.jar は最新 (3.2) です。

アドバイスありがとうございます!

ダニエル

フェリックスセットアップ

    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され、 adb pushで /data/felix に移動されました。

Android アプリケーションで使用したのと同じコードは、通常の Java コンソール アプリケーション内でも機能します。

4

1 に答える 1

2

フレームワークを構築する方法は、私には問題ないように見えます。あなたは考えることができます

  • を Android 固有のリストに置き換えFRAMEWORK_SYSTEMPACKAGESます (たとえば、バンドルがアクティビティを使用する場合)、または
  • 一時ファイルを使用するのではなく、存在することがわかっているディレクトリを指します。

私たちは過去に 3.0.1 をうまく使用してきましたが、あなたが投稿したエラー メッセージはそれと関係があると思います。そのバージョンの Felix を試すことができます。それが機能する場合は、Felix でリグレッションが見つかった可能性があります。その場合は、users@felix.apache.org に報告できます。

于 2011-05-19T08:06:10.637 に答える