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