Утро!
Я создал небольшой проект NDK, который позволяет динамическую сериализацию объектов между Java и C ++ через JNI. Логика работает так:
Бин -> JavaCInterface.Java -> JavaCInterface.cpp -> JavaCInterface.java -> Бин
Проблема в том, что я хочу использовать эту функциональность в других проектах. Я отделил тестовый код от проекта и создал проект «Тестер». Проект тестера отправляет объект Java на 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)
Это все отлично работает. Файлы C ++, основанные на заголовках из модуля JavaCInterface, работают нормально. Также классы Java могут с радостью использовать интерфейсы из проекта JNIBridge. Все ссылки счастливы.
К сожалению, JavaCInterface.java, который содержит вызовы собственных методов, не может видеть метод JNI, расположенный в статической библиотеке. (Логически они находятся в одном проекте, но оба они импортируются в проект, где вы хотите использовать их с помощью вышеуказанного механизма).
Мои текущие решения следующие. Я надеюсь, что кто-то может предложить что-то, что сохранит модульный характер того, чего я пытаюсь достичь:
Мое текущее решение будет включать файлы cpp JavaCInterface в вызывающий проект, например, так:
LOCAL_SRC_FILES := FunctionTable.cpp $(PATH_TO_SHARED_PROJECT)/JavaCInterface.cpp
Но я бы предпочел не делать этого, так как это привело бы к необходимости обновления каждого зависимого проекта, если бы я изменил архитектуру JavaCInterface.
Я мог бы создать новый набор сигнатур методов JNI в каждом локальном проекте, который затем связывался с импортированными модулями. Опять же, это слишком тесно связывает реализации.