1

我尝试使用本机 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
4

1 回答 1

0

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

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

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

于 2013-06-27T07:47:48.903 回答