我一直在研究以下问题:
在我看来,这可以用弱符号来解决。也就是说,本机组件可以提供类似的符号,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
但未定义,因此它的混合信号(可能是一个错误,类似于使用 -fno-weak 时将GXX_WEAK定义为 0 )。SUPPORTS_WEAK
我不确定我是否做错了什么,或者在 c++ 代码中遇到了 const 和 weak 属性之类的东西,或者其他的东西。
Android 是否支持弱符号?如果是这样,如何使用它们。
这是一个没有答案的类似 Stack Overflow 问题:
一些系统细节:
- 基本系统是 Mac OS X 10.8.5,已完全修补
- Eclipse 4.4.1 (Luna),完全修补
- Android NDK 修订版 10d
- GCC 4.9 交叉编译器