Лучший способ создания сложных нативных + java-библиотек с Android SDK + NDK

Я создаю многоплатформенный SDK для 3D-приложений в реальном времени. Этот SDK написан на C ++ и работает под Windows, iOS от Apple, MacOS, Linux и Android.

Структура проекта сложна, она состоит из 3 собственных статических библиотек C ++, связанных с некоторыми внешними статическими библиотеками в полной разделяемой библиотеке. Это очень просто под всеми управляемыми ОС, кроме Android.

Основная проблема в Android - это двунаправленная связь / вызовы между собственным кодом и кодом Java. Некоторое время назад я решил эту проблему, используя SWIG, чтобы обернуть классы общей библиотеки. Для этого я написал свои собственные сценарии сборки (Makefiles) для обработки нативной компиляции с помощью ndk r4, генерации кода swig, предварительной компиляции java и создания jar.

В последнее время мы добавили некоторые классы обратного вызова / прослушивателя в слой C ++, которые мы хотели получить / перегрузить в Java, для этого мы использовали функцию директоров SWIG. Но похоже, что ему нужны функции JNI (слабые глобальные ссылки), которых не было в NDK r4b. Поэтому нам нужно перейти на более новую версию Android NDK (r6b), в которой есть эти функции. Но поскольку наши собственные сценарии сборки были написаны для NDK r4b, они больше не будут работать.

Я беспокоюсь о том, чтобы все было правильно построено с помощью Android NDK / SDK (в конечном итоге через Eclipse) с файлами Android.mk, чтобы нам не приходилось переписывать все с нуля каждый раз, когда мы переключаемся на новый NDK.

Я хотел бы знать, есть ли способ управлять такой сложной структурой проекта с помощью стандартных Android.mk, ndk-build, ant и eclipse (включая часть SWIG). И если да, то как?

Не стесняйтесь спрашивать об уточнениях, я не уверен, что действительно ясно говорю.

Любая помощь очень ценится.

Флоран Лагайе.


person F.L.    schedule 07.11.2011    source источник


Ответы (2)


Я искал похожую вещь, и, хотя я еще не понял этого, есть хороший пример создания gstreamer на Android.

http://cgit.collabora.com/git/user/derek/androgenizer.git/

Предположительно, он работает с любым приложением с libtoolized.

Вот инструкции по сборке:

http://gstreamer.freedesktop.org/wiki/GstreamerAndroid_InstallInstructions

person ClashTheBunny    schedule 11.12.2011

В конце мы написали специальные правила в файле Android.mk для управления генерацией интерфейса swig.

Не забудьте добавить сгенерированный исходный код C ++ в список исходных файлов перед включением BUILD_STATIC_LIB или BUILD_DYNAMIC_LIB, а также указать swig для создания исходного кода Java в папке, доступной для вашего проекта Java Android.

person F.L.    schedule 24.10.2013