Общие библиотеки 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' в уже скомпилированном двоичном файле?,