Man*_*arm 13 java android sip android-ndk unsatisfiedlinkerror
我有一个android项目,我使用本机代码来处理SIP(使用libosip2和libeXosip2).我的本机代码与库的源一起编译到一个模块中.
代码编译得很好,生成的库具有我期望它拥有的所有符号,但是当我尝试加载生成的库时,我收到以下错误:
E/eXosip.loadLibrary(9210): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1307]: 1941 cannot locate 'srand'...
Run Code Online (Sandbox Code Playgroud)
我的Application.mk看起来像这样:
APP_STL := gnustl_shared
APP_ABI := armeabi-v7a
APP_CPPFLAGS += -fexceptions
Run Code Online (Sandbox Code Playgroud)
我确实使用ndk-depends检查了未捕获的依赖项,这给了我
libeXosip_jni.so
libstdc++.so
liblog.so
libgnustl_shared.so
libm.so
libdl.so
libc.so
Run Code Online (Sandbox Code Playgroud)
添加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)
Run Code Online (Sandbox Code Playgroud)
C/C++不是我的坚韧,所以如果有人能够启发我,我会非常感激:)作为替代方案,解决我的问题也会很好^^
更新1
我将eXosip/osip库与我的代码分开,将其编译成静态库.我还测试了创建一个共享库并从Java内部手动加载它,它失败并出现相同的错误消息.
更新2
我尝试使用gnustl_shared,static和stlport - 错误仍然存在.
Mic*_*aël 18
对于那些在NDK r10c上遇到srand/atof问题而绊到这个线程的人:确保你将android目标设置为19.你的应用程序应该适用于Android 5(21)以及所有较低版本.
如果您将Android目标设置为21,那么您的应用程序将仅在Android 5上运行.但是,您的应用程序将不再适用于所有较低的Android版本,因为无法找到许多stdlib函数(如srand/atof).
亲切的问候,Michaël
感谢 Chris,我意识到了自己的错误,即使用了适用于 64 位设备的 NDK。虽然我无法使用最小的示例来复制该错误(它似乎特定于 libosip2 以及可能的其他示例),但使用 32 位 NDK解决了该问题。
感谢所有花时间发表评论和提出建议的人!
| 归档时间: |
|
| 查看次数: |
12739 次 |
| 最近记录: |