Android NDK共享库

时间:2017-09-12 09:04:26

标签: android android-ndk dlopen unsatisfiedlinkerror

我正在尝试为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-depends输出:

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

这个lib似乎有些奇怪。有人知道可能是什么吗?

2 个答案:

答案 0 :(得分:0)

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

如果您无法重建此库,请按照此处的讨论进行操作: Can I change 'rpath' in an already compiled binary?

答案 1 :(得分:0)

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

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