【发布时间】:2011-06-15 08:35:47
【问题描述】:
早上好!
我创建了一个小型 NDK 项目,它允许通过 JNI 在 Java 和 C++ 之间动态序列化对象。逻辑是这样的:
Bean -> JavaCInterface.Java -> JavaCInterface.cpp -> JavaCInterface.java -> Bean
问题是我想在其他项目中使用此功能。我从项目中分离出测试代码并创建了一个“Tester”项目。测试器项目将一个 Java 对象发送到 C++,然后 C++ 将其回显给 Java 层。
我认为链接会非常简单 - (就 NDK/JNI 而言,“简单”通常是令人沮丧的一天)我将 JNIBridge 项目添加为源项目,并在 Android.mk 中包含以下行:
NDK_MODULE_PATH=.../JNIBridge/jni/"
JNIBridge/jni/JavaCInterface/Android.mk:
...
include $(BUILD_STATIC_LIBRARY)
JNITester/jni/Android.mk:
...
include $(BUILD_SHARED_LIBRARY)
$(call import-module, JavaCInterface)
这一切都很好。依赖于 JavaCInterface 模块头文件的 C++ 文件工作正常。 Java 类也可以愉快地使用 JNIBridge 项目中的接口。所有的链接都很愉快。
不幸的是,包含本地方法调用的 JavaCInterface.java 无法看到位于静态库中的 JNI 方法。 (逻辑上它们在同一个项目中,但都通过上述机制导入到您希望使用它们的项目中)。
我目前的解决方案如下。我希望有人能提出一些建议,以保持我想要实现的模块化特性:
我当前的解决方案是在调用项目中包含 JavaCInterface cpp 文件,如下所示:
LOCAL_SRC_FILES := FunctionTable.cpp $(PATH_TO_SHARED_PROJECT)/JavaCInterface.cpp
但我宁愿不这样做,因为如果我更改 JavaCInterface 架构,它会导致我需要更新每个依赖项目。
我可以在每个本地项目中创建一组新的 JNI 方法签名,然后链接到导入的模块。同样,这将实现绑定得太紧。
【问题讨论】:
标签: java-native-interface android-ndk import-module