早晨!
我创建了一个小型 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 方法签名,然后链接到导入的模块。同样,这将实现绑定得太紧。