安卓NDK:load_library:找不到srand

我有一个Android项目,我使用原生代码来做SIP的事情(使用libosip2和libeXosip2)。我的本机代码与库的源代码一起编译到一个模块中。

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

E/eXosip.loadLibrary(9210): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1307]:  1941 cannot locate 'srand'...

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

APP_STL         := gnustl_shared
APP_ABI         := armeabi-v7a
APP_CPPFLAGS    += -fexceptions

我确实使用ndk-depends检查了未捕获的依赖项,这给了我

libeXosip_jni.so
libstdc++.so
liblog.so
libgnustl_shared.so
libm.so
libdl.so
libc.so

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

我的 Android.mk:

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 - 错误仍然存在。


答案 1

对于那些在NDK r10c上遇到srand/atof问题时偶然发现此线程的人:请确保将Android目标设置为19。然后,您的应用应该在 Android 5 (21) 以及所有较低版本上运行。

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

亲切的问候,米歇尔


答案 2

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

感谢所有花时间发表评论和提出建议的人!


推荐