Общие библиотеки Android NDK

Я пытаюсь создать собственную библиотеку для приложения 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

Кажется, что-то странное с этой библиотекой. Кто-нибудь знает, что может быть?

1 ответ

Проблема в 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 add "-Wl,-soname,libfn_dsp.so"вариант. 2. В противном случае вы используете System.loadLibrary("fn_dsp") вручную загрузить libfn_dsp.so перед загрузкой libprocess.so.

Бинарный файл libfn_dsp.so был - по любой причине - собран с помощью rpath без SONAME. Вы можете использовать утилиту objdump (входит в состав Android NDK), чтобы увидеть подтверждение.

Если вы не можете перестроить эту библиотеку, следуйте обсуждению здесь: Могу ли я изменить 'rpath' в уже скомпилированном двоичном файле?,

Другие вопросы по тегам