【发布时间】:2014-10-17 23:06:28
【问题描述】:
我有一个 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 - 错误仍然存在。
【问题讨论】:
-
grep 你的各种 .so 文件并找出哪一个依赖于 srand。添加基于 Android 支持的实现/仿真,可能是不同的随机 AP。
-
我仍然不知道它是什么,所以我会暂时搁置这个问题,看看是否有人能提出真正的解决方案。我现在可以将我的 NDK 从 r10 降级到 r9d。不知道有什么不同,好像只有我一个人经历过。
-
两个关键问题:您使用的确切 NDK R10 下载是什么?接下来,
find YOUR_NDK_R10_DIRECTORY -name "stdlib.h" | xargs grep "srand("的输出中是否有任何行没有指定“inline”? -
嗨,@Managarm,你还记得造成这种情况的根本原因吗?我正在努力弄清楚为什么会发生这种情况。在我的情况下,它是一个不同的函数,它是 libc 的一部分。怎么不见了?
-
@WindRider 在我的情况下,这是因为我使用的是 64 位 NDK。使用 32 位 NDK 对我有用。
标签: java android android-ndk sip unsatisfiedlinkerror