Я работал с проектом, который должен связываться с двумя общими библиотеками из других приложений, фактически не включая их в окончательный пакет. Я использовал Android Studio с обычным способом выполнения внешнего ndk-build
но сейчас я использую экспериментальную поддержку NDK Gradle.
Из того, что я понимаю из информации Вот, использование исходного набора jniLibs позволит упаковать двоичный файл с конечным приложением, а это не то, что я хочу. Я хотел бы связываться с библиотеками во время компиляции и ожидать, что мой собственный модуль загружен в среде, где они доступны.
Мой старый обходной путь — добавить строку: TARGET_NO_UNDEFINED_LDFLAGS :=
в Android.mk, но я не знаю ни о каком пути к чему-то эквивалентному с новой поддержкой NDK.
В настоящее время я в том числе jni
каталог, который содержит библиотеки вместе с моим источником, добавив -L"<directory>"
в ldFlags
и связываю их как с системной библиотекой, как показано ниже (в настоящее время я работаю только для ARMv7):
android.ndk {
moduleName = "ropecraftpe"ldLibs.addAll(['log', 'name of one library', 'name of other library'])
ldFlags.add('-L"' + file('src/main/jni').absolutePath + '"')
cppFlags.add('-std=c++11')
stl = 'gnustl_shared'
abiFilters.addAll(['armeabi-v7a'])
}
Это работает по большей части — как ни странно, компоновщик не жалуется на вызовы статических функций или глобальных переменных, но делает пожаловаться при попытке использовать конструктор, определенный в одной из библиотек: Error:(12) undefined reference to 'ClassName::ClassName(std::string const&, etc.)'
, Этот класс определен в заголовочном файле, включенном в мой собственный код C ++, и конструктор определенно присутствует в связанном .so
,
Как можно успешно связать этот проект?
Я сделал обходной путь; Мое решение состояло в том, чтобы добавить библиотеки, с которыми я хотел связать, в каталог системных библиотек NDK.
Это находится под ANDROID_NDK/platforms/android-XX/arch-XX/usr/lib/
, Кажется, это работает нормально, так как я хотел, чтобы библиотеки обрабатывались так же, как системные библиотеки (не включены как предварительные сборки, но все еще связаны с ними).
Кроме того, можно поместить заголовочные файлы под include
каталог там.
Других решений пока нет …