#c #c #android-ndk #ndk-build #bionic
#c #c #android-ndk #ndk-сборка #bionic
Вопрос:
Приложение поддерживает до 32 бит. Проблема при переходе с 32-битного (armeabi-v7a) на 64-битный (arm64-v8a).
Issue - assertion "orig___sfp" failed
В проекте используются два символа __sfp и __sflag. Они отлично работают с 32-битным. Эти символы используются в одной функции.
int flags, oflags;
if ((flags = orig___sflags(mode, amp;oflags)) == 0)
return (NULL);
my_FILE *fp;
if ((fp = (my_FILE *)orig___sfp()) == NULL)
return (NULL);
Эти символы скрыты, их можно найти по ссылкам ниже.
https://android.googlesource.com/platform/bionic/ /50a7621b3fc493ffbb72aa23e29a4f1727dc1f51/libc/stdio/local. h
https://android.googlesource.com/platform/bionic / /a818445^!/
Кто-нибудь может знать, какие символы заменяются в этом месте? Какие из них совместимы с 64-битным?
Комментарии:
1.
orig___sflags
должна быть внутренняя функция, пожалуйста, проверьте, как контролируются возвращаемые значения в 32-битном и 64-битном режимах компиляции2. Вы заметили, что все эти символы в опубликованной вами ссылке помечены
__LIBC32_LEGACY_PUBLIC__
тегами? У вас не будет их в 64-разрядных реализациях. В зависимости от специфичных для реализации особенностей внутренних объектов, таких какFILE
структуры, это в корне неверно, и это кусает вас здесь. Не делайте этого, и у вас не будет этих проблем.3. да, я заметил это__LIBC32_LEGACY_PUBLIC__ . Но от него зависит несколько функций. Итак, ищем совместимые символы.
4. Вы планируете повторить ту же ошибку, полагаясь на внутренние детали реализации, которые, очевидно, могут и изменяются?