Android поддерживает слабые символы?
Я смотрю на такие вопросы, как:
Невозможно загрузить библиотеку: reloc_library [1285]: не удается найти 'rand'Android-приложение вылетает в начале, потому что java.lang.UnsatisfiedLinkErrorМне кажется, это можно решить с помощьюслабые символы, То есть нативный компонент может предоставлять такие символы, какrand
но украсить их__attribute__((weak))
, Если символ найден в другой библиотеке, например, во время выполнения, то слабо связанный символне использоваться. С другой стороны, если символ отсутствует, то будет использоваться версия нативного компонента.
У меня проблемы с поиском информации для Android (слишком много посторонних шумов при поиске).
Я открыл один из моих примеров проектов Crypto ++ / JNI и добавил следующее в файл CPP.AutoSeededRandomPool
это просто объект генератора случайных чисел Crypto ++ (здесь нет ничего особенного или хитрого).
// CPP file
#ifdef __cplusplus
extern "C" {
#endif
int __attribute__((weak)) rand(void)
{
int r;
AutoSeededRandomPool& prng = GetPRNG();
prng.GenerateBlock(&r, sizeof(r));
return r;
}
#ifdef __cplusplus
}
#endif
Попытка скомпилировать это приводит кredefinition of int rand()
, Я также попробовал следующее:
// CPP file
#ifdef __cplusplus
extern "C" {
#endif
int rand(void) __attribute__((weak));
int random(void)
{
...
}
#ifdef __cplusplus
}
#endif
И движетсяint rand(void) __attribute__((weak));
в файл H выдает то же самоеredefinition of int rand()
.
И я не получаю никаких ошибок или предупреждений о неизвестном атрибуте.
Я также вижу, что__GXX_WEAK__
определяется для1
в препроцессоре, ноSUPPORTS_WEAK
являетсяне определены, поэтому его смешанные сигналы (возможно, ошибка, похожая наопределятьGXX_WEAK до 0 при использовании -fno-слабого).
Я не уверен, что делаю что-то не так или испытываю что-то вродеконстантный и слабый атрибут с кодом C ++, или что-то другое.
Android поддерживает слабые символы? Если так, то как их использовать.
Вот аналогичный вопрос переполнения стека, на который нет ответа:
Различное поведение переопределения слабой функции в разделяемой библиотеке между OS X и AndroidНекоторые системные детали:
Базовая система - Mac OS X 10.8.5, полностью исправленаЗатмение 4.4.1 (Луна), полностью исправленоAndroid NDK Revision 10dGCC 4.9 кросс-компилятор