【发布时间】:2015-03-12 04:21:11
【问题描述】:
我一直在研究以下问题:
- Cannot load library: reloc_library[1285]: cannot locate 'rand'
- Android app crashes in the start because java.lang.UnsatisfiedLinkError
在我看来,这可以通过weak symbols 解决。也就是说,本机组件可以提供像rand 这样的符号,但用__attribute__((weak)) 装饰它们。如果符号在另一个库中找到,比如标准运行时,那么弱链接符号将 not 被使用。另一方面,如果缺少符号,则将使用本机组件的版本。
我无法在其上查找适用于 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 是没有定义的,所以它的混合信号(可能是一个错误,类似于Define GXX_WEAK to 0 when using -fno-weak) .
我不确定我是不是做错了什么,或者遇到了const and weak attribute with c++ code 之类的问题,或者其他什么。
Android 是否支持弱符号?如果是这样,如何使用它们。
这里有一个没有答案的类似 Stack Overflow 问题:
一些系统细节:
- 基本系统是 Mac OS X 10.8.5,已完全修补
- Eclipse 4.4.1 (Luna),已完全修补
- Android NDK 修订版 10d
- GCC 4.9 交叉编译器
【问题讨论】:
-
您使用的是什么 API 级别?在 pre-21
rand()是一个内联函数,所以这将是你的多重定义。
标签: android c++ android-ndk weak-linking