У меня есть проект Android, где я использую собственный код для работы с SIP (используя libosip2 и libeXosip2). Мой собственный код скомпилирован вместе с источниками библиотек в один модуль.
Код компилируется просто отлично, и у сгенерированной библиотеки есть все символы, которые я ожидаю, но когда я пытаюсь загрузить сгенерированную библиотеку, я получаю следующую ошибку:
E/eXosip.loadLibrary(9210): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1307]: 1941 cannot locate 'srand'...
My Application.mk выглядит так:
APP_STL := gnustl_shared
APP_ABI := armeabi-v7a
APP_CPPFLAGS += -fexceptions
Я проверял наличие неперехваченных зависимостей, используя ndk-depend, что дает мне
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/С++ - это не моя стойкость, поэтому, если кто-то может просветить меня, я был бы очень благодарен:) В качестве альтернативы решение моей проблемы было бы также приятным ^^
Обновление 1
Я отделил библиотеку eXosip/osip от своего кода, скомпилировав его в статической библиотеке. Я также протестировал создание общей библиотеки и загрузку ее вручную изнутри Java, она не работает с тем же сообщением об ошибке.
Обновление 2
Я попытался использовать gnustl_shared, static, а также stlport - ошибка остается.