1

Felix を実行している Android デバイスにデプロイするために、ネイティブ C/C++ コードを使用して OSGi バンドルを作成しようとしています。

Android NDK arm-linux-androideabi ツールチェーンを使用して、ネイティブ コードをコンパイルし、共有オブジェクトにリンクすることができました。

ここで、Eclipse PDE を使用して OSGi バンドルを .jar ファイルにエクスポートしようとします ([エクスポート] -> [デプロイ可能なプラグインとフラグメント])。これは失敗します。エラーウィンドウがポップアップすると、次のように表示されます。

'Export Plug-ins' has encountered a problem. 
Processing inclusion from feature org.eclipse.pde.container.feature: Bundle my.bundle.jni_test_1.0.0.qualifier failed to resolve: 
     Unsatisfied native code filter: natives/libjni_example.so; processor=arm; osname=linux.

プロセッサを別のもの (x86 など) に設定すると、エクスポートは機能しますが、Android デバイスで起動すると、バンドルに「未解決の制約」エラーが表示されます。

私は完全にばかげたことをしていないことを願っています。ここで何がうまくいかないのですか?Android 用にコンパイルされたネイティブ コードを OSGi バンドルに追加するにはどうすればよいですか?

完全を期すために、Java、C、マニフェスト、および build.properties コンテンツを添付します。

Java -> JNI_Test:

package my.bundle.jni_test;
public class JNI_Test {
    private void doWork() {
        System.out.println("3+3=" + add(3,3));
    }
    static {
        System.loadLibrary("jni_example");
    }
    public final static native int add(int x, int y);
}

C -> jni_example:

#include "include/my_bundle_jni_0005ftest_JNI_0005fTest.h"
#include <stdio.h>
JNIEXPORT jint JNICALL Java_my_bundle_jni_1test_JNI_1Test_add(JNIEnv *env, jclass clazz, jint x, jint y) {
    char buf[100];
    sprintf(buf, "adding %d to %d\n", x, y);
    fprintf(stdout, "[INFO] - %s", buf);
    fflush(stdout);
    return x+y;
}

マニフェスト:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: JNI Test
Bundle-SymbolicName: my.bundle.jni_test
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-NativeCode: natives/libjni_example.so;osname=linux;processor=arm
Export-Package: my.bundle.jni_test

build.properties:

source.. = src/
output.. = bin/
bin.includes = META-INF/,\
               .,\
               natives/libjni_example.so
4

1 に答える 1

0

「ウィンドウ -> 設定 -> プラグイン開発 - ターゲット プラットフォーム」で定義されたターゲット プラットフォームが、エクスポートの成功を妨げているようです。

現在のターゲット プラットフォームから設定をコピーする新しいエントリを追加しました ([現在のターゲット] オプションを選択)。そこで、「環境」の下の「アーキテクチャ」の値を「アーム」に変更しました。「アーム」はドロップダウン リストのオプションではなかったので、テキスト フィールドに手動で入力しました。

それでおしまい。このターゲット構成を使用すると、すべてが正常に機能するようになりました。バンドルが正常にエクスポートされ、Android デバイスで使用できるようになりました。

于 2013-06-27T07:47:48.903 に答える