【问题标题】:"Unsatisfied native code filter" when exporting OSGi bundle containing native Android lib导出包含本机 Android 库的 OSGi 包时出现“不满意的本机代码过滤器”
【发布时间】:2026-02-22 10:15:01
【问题描述】:

我尝试使用本机 C/C++ 代码创建一个 OSGi 包,以便在运行 Felix 的 Android 设备上进行部署。

我能够编译本机代码并将其链接到使用 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、Manifest 和 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

【问题讨论】:

    标签: android eclipse java-native-interface osgi apache-felix


    【解决方案1】:

    似乎在“窗口 -> 首选项 -> 插件开发 - 目标平台”下定义的目标平台阻止了导出成功。

    我添加了一个从当前目标平台复制设置的新条目(选择选项“当前目标”)。在那里,我在“环境”下将“架构”值更改为“臂”。由于“手臂”不是下拉列表提供的选项,我在文本字段中手动输入。

    就是这样。使用此目标配置时,现在一切正常。捆绑包已成功导出,我可以在我的 Android 设备上使用它。

    【讨论】: