2015-04-08 2 views
2

В моем проекте используется NDK r10d для кода на C++. Когда я скомпилирую проект с API19, он отлично работает, но когда я скомпилирую его с API21, он выходит из строя во время выполнения.UnsatisfiedLinkError при компиляции с API21

Когда с Lib загружается я получаю:

dlopen("/data/app-lib/com.my.app-2/libMyCode.so") failed: dlopen failed: cannot locate symbol "stpcpy" referenced by "libMyCode.so"...

Затем он выходит из строя на:

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "stpcpy" referenced by "libMyCode.so"...

Я использую OnePlus One работает Android4.4.4, чтобы проверить его на обоих случаях.

Любые идеи?

ответ

2

Да - заголовки андроида libc изменены в API 21. Некоторые функции, которые ранее не существовали, были перенаправлены на другие функции в старых заголовках. Поэтому вы не можете построить API 21, если хотите работать на более старых устройствах, если не будете стараться работать над такими проблемами. Если вам нужно использовать новые API-интерфейсы API API 21, но все же совместимы со старыми устройствами, вам все равно нужно выполнить ручную работу для достижения этого.

Если вам нужен только новый API для java-стороны, просто установите отдельный APP_PLATFORM=19 в Application.mk, создав java-сторону с более новым SDK.

См. Cannot load library: reloc_library[1285]: cannot locate 'rand' для получения более подробной информации по этой проблеме.

+1

Спасибо! Google, WTF ??? –

1

stpcpy был добавлен в bionic API 21. Это означает, что двоичные файлы, скомпилированные для API 21, могут не работать на более ранних платформах. Это looks likegcc компилятор может оптимизировать для вызова stpcpy, даже если он явно не используется в вашем коде. Связанная проблема также имеет рекомендуемую обходной путь:

size_t src_len = strlen(src); 
return memcpy(dst, src, src_len) + src_len; 
0

Проблема заключалась в том, что, вероятно, из-за вопросов безопасности, то устаревшие процедуры strcpy и strlen где удалены.

Я заменил их strncpy и strnlen, и он отлично работает.

Смежные вопросы