首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android : load_library:无法找到srand

Android : load_library:无法找到srand
EN

Stack Overflow用户
提问于 2014-08-24 18:39:46
回答 7查看 13.3K关注 0票数 14

我有一个android项目,在这个项目中,我使用本机代码来处理SIP (使用libosip2和libeXosip2)。我的本机代码与库的源代码一起编译成一个模块。

代码编译得很好,生成的库具有我希望它具有的所有符号,但是当我试图加载生成的库时,会得到以下错误:

代码语言:javascript
运行
复制
E/eXosip.loadLibrary(9210): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1307]:  1941 cannot locate 'srand'...

我的Application.mk看起来是这样的:

代码语言:javascript
运行
复制
APP_STL         := gnustl_shared
APP_ABI         := armeabi-v7a
APP_CPPFLAGS    += -fexceptions

我确实使用ndk-依赖性检查了未确定的依赖项,这给了我

代码语言:javascript
运行
复制
libeXosip_jni.so
libstdc++.so
liblog.so
libgnustl_shared.so
libm.so
libdl.so
libc.so

添加一个loadLibrary("gnustl_shared")没有帮助(这是在“libs/armeabi-v7/”中唯一提到的库)。

我的Android.mk:

代码语言:javascript
运行
复制
LOCAL_PATH  := $(call my-dir)
$(shell (cd $(LOCAL_PATH); sh extract_stuff.sh; cd $(OLDPWD)))


include $(CLEAR_VARS)
OSIP        := libosip2-4.1.0
EXOSIP      := libeXosip2-4.1.0
LOCAL_MODULE    := eXosip

LOCAL_C_INCLUDES    := $(LOCAL_PATH)/$(OSIP)/include \
                       $(LOCAL_PATH)/$(EXOSIP)/include

LOCAL_SRC_FILES := $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/$(OSIP)/src/osipparser2/*.c)) \
                   $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/$(OSIP)/src/osip2/*.c)) \
                   $(patsubst $(LOCAL_PATH)/%, %, $(wildcard $(LOCAL_PATH)/$(EXOSIP)/src/*.c))

LOCAL_CFLAGS += -DHAVE_FCNTL_H \
                -DHAVE_SYS_TIME_H \
                -DHAVE_STRUCT_TIMEVAL \
                -DHAVE_SYS_SELECT_H \
                -DHAVE_PTHREAD \
                -DHAVE_SEMAPHORE_H \
                -DENABLE_TRACE \
                -DOSIP_MT

include $(BUILD_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := eXosip_jni
LOCAL_STATIC_LIBRARIES  := eXosip
LOCAL_LDLIBS := -llog 

LOCAL_C_INCLUDES := BackendData.h \
                    $(LOCAL_PATH)/$(EXOSIP)/include \
                    $(LOCAL_PATH)/$(OSIP)/include

LOCAL_SRC_FILES := eXosip.cpp \
                   eXosipCall.cpp

include $(BUILD_SHARED_LIBRARY)

C/C++不是我的坚韧,所以如果有人能启发我,我会非常感激:)作为另一种选择,解决我的问题也是很好的^^。

更新1

我将eXosip/osip库从代码中分离出来,将其编译成一个静态库。我还测试了如何创建一个共享库,并从Java内部手动加载它,它在相同的错误消息中失败。

更新2

我尝试使用gnustl_shared,静态和stlport -错误仍然存在。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-08-29 10:54:34

多亏了克里斯,我才意识到我的错误,那就是把NDK应用于64位设备。虽然我无法使用最小的示例复制错误(它似乎是特定于libosip2和其他方面的),但使用32位NDK的解决了这个问题。

感谢大家花时间发表意见和建议!

票数 2
EN

Stack Overflow用户

发布于 2014-10-23 05:59:53

对于那些在NDK r10c上遇到srand/atof问题的人来说,请确保将你的android目标设置为19,然后你的应用程序应该在Android 5 (21)以及所有较低的版本上工作。

如果您将android目标设置为21,那么您的应用程序将只在Android 5上运行。然而,您的应用程序将不再适用于所有较低的android版本,因为无法找到许多stdlib函数(比如srand/atof)。

致以良好的问候,Micha l

票数 18
EN

Stack Overflow用户

发布于 2014-10-01 22:56:49

同样的问题也发生在int rand(void)int rand_r(unsigned int*)函数在NDK64 r10b上(2014年9月)。要进行复制,只需编译NDK64 r10b提供的任何示例,然后调用int rand(void)int rand_r(unsigned int*)

在NDK32 r10b中,这些函数在stdlib.h中定义为static __inline__,而在NDK64 r10b上没有定义。

正如Managarm所提到的,使用NDK32 r10b解决了这个问题,但是对于那些想为arm64-v8a目标编译的人来说,它是一个阻塞点!

得出的结论是,NDK64 r10b在这一点上有一个错误。

可能的修补程序:将NDK64 r10b stdlib.h中缺少的函数的原始定义替换为NDK32 r10b stdlib.h中的static定义。例:对于srand()来说,它会变成:

代码语言:javascript
运行
复制
static __inline__ void srand(unsigned int __s)
{
        srand48(__s);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25475055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档