Android NDK: load_library: impossible de localiser srand

J'ai un projet android où j'utilise le code natif pour faire des trucs avec le protocole SIP (à l'aide de libosip2 et libeXosip2). D'origine de mon code est compilé avec la bibliothèque de sources dans un même module.

Le code se compile très bien et la bibliothèque générée a tous les symboles-je m'attendre à avoir, mais quand j'essaye de charger la bibliothèque générée j'obtiens l'erreur suivante:

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

Ma Demande.mk ressemble à ceci:

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

Je n'ai vérifier les dépendances avec le ndk-dépend, ce qui me donne

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

L'ajout d'une fonction loadLibrary("gnustl_shared") n'aide pas (qui est le seul de ces bibliothèques également trouvé dans les "libs/armeabi-v7/").

Mon 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++ n'est pas ma force, donc si quelqu'un pouvait m'éclairer je lui en serais vraiment reconnaissante 🙂 Comme une alternative, une solution à mon problème serait bien aussi ^^


Mise à jour de 1

Je me suis séparé de la eXosip/osip bibliothèque de mon code, le compiler dans une bibliothèque statique. J'ai aussi testé la création d'une bibliothèque partagée et de les charger à la main à partir de l'intérieur de Java, il échoue avec le même message d'erreur.

Mise à jour 2

J'ai essayé d'utiliser gnustl_shared, statique et aussi stlport - l'erreur reste.

grep votre divers .donc, et trouver celle qui dépend srand. Ajouter une mise en œuvre/l'émulation basée sur quelque chose de Android prend en charge, peut-être un autre hasard AP.
Je ne sais toujours pas ce que c'était, donc je vais laisser cette réponse un peu plus longtemps pour voir si quelqu'un peut venir avec une solution réelle. Maintenant, je l'ai eu de travail déclassement mon NDK de r10 à r9d. Pas sûr de ce qui est différent, il me semble que je suis le seul qui a vécu cela.
Deux questions clés: Quels exacte NDK R10 téléchargement avez-vous utilisé? Ensuite, effectuez l'une des lignes dans la sortie de find YOUR_NDK_R10_DIRECTORY -name "stdlib.h" | xargs grep "srand(" pas spécifier "en ligne" ?
Salut, @Managarm, vous souvenez-vous de la cause de cela? J'ai du mal à comprendre pourquoi cela se produit. Dans mon cas, c'est une autre fonction qui fait partie de la libc. Comment diable est-il absent?
Dans mon cas, c'était parce que j'ai été en utilisant le 64 bits NDK. À l'aide de l'32bit NDK a fonctionné pour moi.

OriginalL'auteur Managarm | 2014-08-24