Мой проект использует NDK r10d для кода C ++.
Когда я компилирую проект с API19, он прекрасно работает, но когда я компилирую его с API21, он падает во время выполнения.
Когда библиотека загружается, я получаю:
Ошибка dlopen («/ data / app-lib / com.my.app-2 / libMyCode.so»): ошибка dlopen: невозможно найти символ «stpcpy», на который ссылается «libMyCode.so» …
Затем он падает на:
java.lang.UnsatisfiedLinkError: ошибка dlopen: не удается найти символ «stpcpy», на который ссылается «libMyCode.so» …
Я использую OnePlus One под управлением Android4.4.4, чтобы протестировать его в обоих случаях.
Есть идеи?
Да, заголовки android libc изменились в API 21. Некоторые функции, которые ранее не существовали, были перенаправлены на другие функции в более старых заголовках. Таким образом, вы не сможете создать API 21, если хотите работать на старых устройствах, если только вы не позаботитесь о таких проблемах. Если вам нужно использовать новые собственные API-интерфейсы из API 21, но при этом поддерживать совместимость со старыми устройствами, вам все равно придется выполнять ручную работу для достижения этой цели.
Если вы хотите только новый API для стороны Java, просто установите отдельный APP_PLATFORM=19
в Application.mk
, в то время как сборка Java стороны с более новым SDK.
Увидеть Невозможно загрузить библиотеку: reloc_library [1285]: не удается найти ‘rand’ для более подробной информации по этому вопросу.
stpcpy был добавлен в bionic на API 21. Это означает, что двоичные файлы, скомпилированные для API 21, могут не работать на более ранних платформах. Это похоже НКУ Компилятор может оптимизировать вызов stpcpy
даже если это явно не используется в вашем коде. У связанной проблемы также есть предложенный обходной путь:
size_t src_len = strlen(src);
return memcpy(dst, src, src_len) + src_len;
Проблема заключалась в том, что, вероятно, из-за проблем безопасности, устаревшие процедуры strcpy
а также strlen
где удалены.
Я заменил их strncpy
а также strnlen
и это прекрасно работает.