当前位置: 首页 > 面试题库 >

Android NDK:load_library:找不到位置

谷梁晟
2023-03-14
问题内容

我有一个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-错误仍然存​​在。


问题答案:

多亏克里斯(Chris),我才意识到了我的错误,那是使用 用于64位设备NDK
。尽管我无法使用一个最小的示例(该错误似乎特定于libosip2以及其他html" target="_blank">示例)来复制错误,但是 使用32位NDK 解决了该问题。

谢谢大家花时间评论和发表建议!



 类似资料:
  • 编译项目时出现以下错误:错误:未找到SDK位置。使用sdk定义位置。本地目录。属性文件或使用ANDROID_HOME环境变量。这是错误的截图 我怎么解决它?SDK位置很好。问题是我不知道ANDROID_HOME环境变量是什么。

  • 但我仍然得到同样的错误。

  • 我正在尝试运行我的React-native应用程序“Android”,但在我手动添加项目文件中的SDK路径之前,每次都是这样 local.properties RN错误 那我犯了什么错?

  • 需要永久解决。如果有人知道,请告诉我 谢谢你的帮助

  • 我使用的是Windows 7 64位计算机,目标SDK版本是23。

  • 我最近创建了一个新的本地repo,并从我们的远程存储库中提取了一些代码。 当我打开项目时,我在控制台中收到一条消息: 我按照这里的说明设置环境变量(Im in a Mac),并检查了我的local.properties: 所以,这两件事都解决了,我仍然得到这个错误。我已经搜索过了,但是没有一个解决方案对我有效。 有什么帮助吗?非常感谢。 编辑: 这只发生在一个项目中。其余的项目运行良好。