【问题标题】:Android NDK shared librariesAndroid NDK 共享库
【发布时间】:2018-02-20 16:05:09
【问题描述】:

我正在尝试为 Android 应用程序构建本机库。我有 2 个库,我需要将它们链接到我的最终库中,但我有一些问题。 Android.mk 代码:

LOCAL_CFLAGS     := -Wall -Wfloat-equal -std=c99

LOCAL_PATH := $(call my-dir)/..

include $(CLEAR_VARS)
  LOCAL_MODULE            := cpu-lib
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/cpu/inc
  LOCAL_EXPORT_CPPFLAGS   := $(LOCAL_CFLAGS)
  LOCAL_EXPORT_LDLIBS     := -llog
  LOCAL_SRC_FILES         := $(LOCAL_PATH)/cpu/lib/$(TARGET_ARCH_ABI)/libdemoDSP.so
  LOCAL_STATIC_LIBRARIES  := gnustl_static
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
  LOCAL_MODULE            := dsp-lib
  LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/dsp/inc
  LOCAL_EXPORT_CPPFLAGS   := $(LOCAL_CFLAGS)
  LOCAL_EXPORT_LDLIBS     := -llog
  LOCAL_SRC_FILES         := $(LOCAL_PATH)/dsp/lib/$(TARGET_ARCH_ABI)/libfn_dsp.so
  LOCAL_STATIC_LIBRARIES  := gnustl_static
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := process
LOCAL_SRC_FILES := process.cpp
LOCAL_SHARED_LIBRARIES := cpu-lib dsp-lib
include $(BUILD_SHARED_LIBRARY)

问题是dlopen 找不到libfn_dsp.so。 ndk 依赖的输出:

ndk-depends libs\arm64-v8a\libprocess.so
WARNING: Could not find library: ./obj/local/arm64-v8a/libfn_dsp.so
libprocess.so
liblog.so
libdemoDSP.so
libstdc++.so
libm.so
libdl.so
libc.so
./obj/local/arm64-v8a/libfn_dsp.so

该库似乎有些奇怪。有人知道可能是什么吗?

【问题讨论】:

    标签: android android-ndk dlopen unsatisfiedlinkerror


    【解决方案1】:

    libfn_dsp.so 二进制文件 - 无论出于何种原因 - 使用 rpath 构建而没有 SONAME。您可以使用 objdump 实用程序(捆绑在 Android NDK 中)查看证明。

    如果您无法重建此库,请关注此处的讨论:Can I change 'rpath' in an already compiled binary?

    【讨论】:

    • 不幸的是,objdump -x 和 chrpath --list 没有返回 rpath。我已经设法用 soname 构建库并解决了问题,但现在我有另一个库并且没有源代码。它也没有 rpath,我也有同样的问题
    • 您确定您使用的是 NDK 版本的 objdump 吗?请注意,host 二进制文件可能会显示不同的结果。为什么 soname 能挽救局面?
    • 我从未尝试过,但也许patchelf 实用程序可以让您为预建库设置 SONAME,然后它会被正确加载。
    【解决方案2】:

    问题是libfn_dsp.so miss SONAME info,你可以使用“readelf --dynamic libfn_dsp.so |grep SONAME”然后检查输出信息是否为空,你可以使用“readelf --dynamic libdemoDSP.so |grep SONAME”,输出信息是“libdemoDSP.so”。

    如何解决: 1.如果你有libfn_dsp.so源代码,你可以用最新的NDK编译它,或者用旧的NDK添加“-Wl,-soname,libfn_dsp.so”选项。 2. 否则,在加载libprocess.so之前使用System.loadLibrary("fn_dsp")手动加载libfn_dsp.so

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多