O Android suporta símbolos fracos?
Eu estive olhando para perguntas como:
Não é possível carregar a biblioteca: reloc_library [1285]: não é possível localizar 'rand'O aplicativo Android falha no início porque o java.lang.UnsatisfiedLinkErrorParece-me que isso poderia ser resolvido comsímbolos fracos. Ou seja, um componente nativo pode fornecer símbolos comorand
mas adorná-los com__attribute__((weak))
. Se o símbolo for encontrado em outra biblioteca, como o tempo de execução padrão, o símbolo fracamente vinculadonão ser usado. Por outro lado, se o símbolo estivesse faltando, a versão do componente nativo seria usada.
Estou com problemas para localizar informações nele para Android (muito ruído não relacionado durante a pesquisa).
Abri um dos meus projetos de amostra Crypto ++ / JNI e adicionei o seguinte a um arquivo CPP. oAutoSeededRandomPool
é apenas um objeto gerador de número aleatório Crypto ++ (não há nada de especial ou complicado abaixo).
// 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
Tentar compilar resulta emredefinition of int rand()
. Eu também tentei o seguinte:
// CPP file
#ifdef __cplusplus
extern "C" {
#endif
int rand(void) __attribute__((weak));
int random(void)
{
...
}
#ifdef __cplusplus
}
#endif
E em movimentoint rand(void) __attribute__((weak));
para o arquivo H produz o mesmoredefinition of int rand()
.
E não recebo erros ou avisos sobre um atributo desconhecido.
Eu também vejo isso__GXX_WEAK__
está definido como1
no pré-processador, masSUPPORTS_WEAK
énão definidos, seus sinais mistos (talvez um bug, semelhante aoDefinirGXX_WEAK para 0 ao usar -fno-fraco)
Não tenho certeza se estou fazendo algo errado ou experimentando algo comoatributo const e fraco com código c ++, ou alguma outra coisa.
O Android suporta símbolos fracos? Se sim, como alguém as usa.
Aqui está uma pergunta semelhante ao Stack Overflow que não tem resposta:
Comportamento diferente da função fraca de substituição na biblioteca compartilhada entre OS X e AndroidAlguns detalhes do sistema:
O sistema básico é o Mac OS X 10.8.5, totalmente corrigidoEclipse 4.4.1 (Luna), totalmente corrigidoRevisão NDD do Android 10dCompilador cruzado do GCC 4.9