Импорт-модуль Android NDK / повторное использование кода

Доброе утро!

Я создал небольшой проект NDK, который позволяет динамическую сериализацию объектов между Java и C ++ через JNI. Логика работает следующим образом:

Bean -> JavaCInterface.Java -> JavaCInterface.cpp -> JavaCInterface.java -> Bean

Проблема в том, что я хочу использовать эту функциональность в других проектах. Я выделил тестовый код из проекта и создал проект «Тестировщик». Проект тестера отправляет объект 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-методов в каждом локальном проекте, которые затем связываются с импортированными модулями. Опять же, это слишком сильно связывает реализации.

12
задан Graeme 15 June 2011 в 08:41
поделиться