Здание Android NDK - Включить LOCAL_SHARED_LIBRARIES?

У меня возникают проблемы с созданием проекта под Android NDK. Скорее всего, это связано с тем, что соответствующие общие/статические библиотеки не включены. Те, что были добавлены как -someLib, но те, что LOCAL_SHARED_LIBRARIES не включены, кажется...

Мой Android.mk содержит следующие

LOCAL_SHARED_LIBRARIES + = libutils libmedia libz libbinder

  • Где ndk-build действительно ищет эти библиотеки?
  • Если я не включаю -lutils -lmedia -lz -lbinder, я не могу даже попасть в ошибку компоновщика. У меня есть чувство, включая только -LsomeDir, и -lsomeLib - это не правильный способ их добавления.

Вот полный Android.mk.

LOCAL_PATH := /Users/kevin/Desktop/player2/videoplayer/videoplayer/jni
LIBPLAYER_PATH := $(LOCAL_PATH)/../../LibPlayer

include $(CLEAR_VARS)

$(warning Android make file: $(LOCAL_PATH)/Android.mk)
$(warning Android sysroot: $(SYSROOT))
$(warning Additional LD_LIBS: $(LOCAL_PATH)/lib)

ifeq ($(BUILD_ID),MID)
        LOCAL_CFLAGS += -DENABLE_FREE_SCALE
endif

LOCAL_MODULE    := libamplayerjni
LOCAL_SRC_FILES := com_farcore_playerservice_AmPlayer.c sys_conf.c
LOCAL_ARM_MODE := arm
LOCAL_C_INCLUDES := $(LIBPLAYER_PATH)/amplayer/player/include \
    $(LIBPLAYER_PATH)/amplayer/control/include \
    $(LIBPLAYER_PATH)/amcodec/include \
    $(LIBPLAYER_PATH)/amffmpeg \
    $(JNI_H_INCLUDE) \
    /Android/ndk/build/tools/android-9-toolchain/sysroot/usr/include \
    /Android/ndk/build/platforms/android-9/arch-arm/usr/include \
    /Android/source_2.3/system/core/include \
    /Android/source_2.3/frameworks/base/include

LOCAL_LDLIBS := -L/Users/kevin/Desktop/player2/videoplayer/videoplayer/jni/lib -L$(SYSROOT)/usr/lib -llog -lz -lm -ldl **-lmedia -lstagefright -lutils -lbinder -lgcc -landroid -lc -lstdc++ -lthread_db**

**LOCAL_STATIC_LIBRARIES := libamplayer libamcodec libavformat libavcodec libavutil libamadec**
LOCAL_SHARED_LIBRARIES += libutils libmedia libz libbinder 

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

Одна из многих ошибок, связанных конкретно с этими библиотеками (например, libmedia.so).

/Users/kevin/Desktop/player2/videoplayer/videoplayer/obj/local/armeabi-v7a/libamadec.a(android_out.o): In function `android_uninit':
/Users/kevin/Desktop/player2/videoplayer/LibPlayer/amadec/audio_out/android_out.cpp:220: undefined reference to `android::AudioTrack::stop()'
/Users/kevin/Desktop/player2/videoplayer/LibPlayer/amadec/audio_out/android_out.cpp:228: undefined reference to `android::AudioTrack::~AudioTrack()'
/Users/kevin/Desktop/player2/videoplayer/videoplayer/obj/local/armeabi-v7a/libamadec.a(android_out.o): In function `~Autolock':

Ответ 1

Мне кажется, что вы не должны включать -lmedia и т.д. в свои аргументы LOCAL_LDLIBS.

1. Где ndk-build действительно ищет эти библиотеки?

Если вы посмотрите в $NDK/docs/STABLE-APIS.html, вы увидите, что есть определенный набор библиотек, которые вы можете включить таким образом. Примечание:

The headers corresponding to a given API level are now located under $NDK/platforms/android-<level>/arch-arm/usr/include

Посмотрев на себя, ни одна из библиотек, которые вы указали, не существует, хотя я искал API-14.


2. Если я не включаю -lutils -lmedia -lz -lbinder, я не могу даже дойти до ошибки компоновщика. У меня есть чувство, в том числе только -LsomeDir, и -lsomeLib - не правильный способ их добавления.

Если ваши библиотеки - это просто обычные библиотеки c/С++, которые вы бы #include, вы должны использовать LOCAL_C_INCLUDES.

Также обратите внимание, от $NDK/docs/ANDROID-MK.html:

  • Система сборки обрабатывает многие детали для вас. Например, вы не нужно указывать файлы заголовков или явные зависимости между сгенерированных файлов в вашем Android.mk. Система сборки NDK будет вычислите их автоматически для вас.

Чтобы использовать другие библиотеки в моем собственном коде, я просто #include, а затем укажите, где найти заголовки. Здесь мой LOCAL_C_INCLUDES:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/shared/Core/inc \
                    $(LOCAL_PATH)/shared/Model/inc  \
                    $(LOCAL_PATH)/shared/boost/include

Надеюсь, это поможет.