gpt4 book ai didi

java - 安卓NDK : load_library: cannot locate srand

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:02 26 4
gpt4 key购买 nike

我有一个 android 项目,我在其中使用 native 代码来处理 SIP(​​使用 libosip2 和 libeXosip2)。我的 native 代码与库的源代码一起编译到一个模块中。

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

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、static 和 STLport - 错误仍然存​​在。

最佳答案

对于那些在 NDK r10c 上遇到 srand/atof 问题时绊倒在这个线程上的人:确保将你的 android 目标设置为 19。然后你的应用程序应该可以在 Android 5 (21) 以及所有较低版本上运行。

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

亲切的问候,迈克尔

关于java - 安卓NDK : load_library: cannot locate srand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com