Frage an android, c++, android-ndk – Android NDK-Gebäude - LOCAL_SHARED_LIBRARIES einbeziehen?

10

Ich habe Probleme beim Erstellen eines Projekts unter Android NDK. Höchstwahrscheinlich liegt es daran, dass die richtigen gemeinsam genutzten / statischen Bibliotheken nicht enthalten sind. Die als -lsomeLib, die ich hinzugefügt habe, aber die als LOCAL_SHARED_LIBRARIES werden anscheinend nicht einbezogen ...

Mein Android.mk enthält Folgendes

LOCAL_SHARED_LIBRARIES + = libutils libmedia libz libbinder

Wo sucht ndk-build eigentlich nach diesen Bibliotheken?Wenn ich den -lutils -lmedia -lz -lbinder nicht einbinde, komme ich nicht einmal zum Linker-Fehler. Ich habe das Gefühl, nur -LsomeDir und -lsomeLib sind nicht die richtige Methode, um sie hinzuzufügen.

Hier ist die komplette 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)

Einer von vielen Fehlern, die sich speziell auf diese Bibliotheken beziehen (z. B. 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':

Deine Antwort

1   die antwort
7

-lmedia etc in deinemLOCAL_LDLIBS Argumente.

1. Wo sucht ndk-build eigentlich nach diesen Bibliotheken?

Wenn du reinschaust$NDK/docs/STABLE-APIS.html Sie werden sehen, dass es einen bestimmten Satz von Bibliotheken gibt, die Sie auf diese Weise einschließen können. Hinweis:

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

Nachdem ich mich selbst angesehen habe, existiert dort keine der von Ihnen angegebenen Bibliotheken, obwohl ich nur nach API-14 gesucht habe.

2. Wenn ich den -lutils -lmedia -lz -lbinder nicht einbinde, kann ich nicht einmal zum Linker-Fehler gelangen. Ich habe das Gefühl, nur -LsomeDir und -lsomeLib sind nicht die richtige Methode, um sie hinzuzufügen.

Wenn Ihre Bibliotheken nur normale C / C ++ - Bibliotheken sind, würden Sie dies tun#include du solltest benutzenLOCAL_C_INCLUDES stattdessen.

Beachten Sie auch, von$NDK/docs/ANDROID-MK.html:

Das Build-System verarbeitet viele Details für Sie. Beispielsweise müssen Sie in Android.mk keine Header-Dateien oder expliziten Abhängigkeiten zwischen generierten Dateien auflisten. Das NDK-Build-System berechnet diese automatisch für Sie.

Um andere Bibliotheken in meinem nativen Code zu verwenden, habe ich einfach#include Geben Sie an, wo sich die Überschriften befinden sollen. Hier ist meinsLOCAL_C_INCLUDES:

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

Ich hoffe das hilft.

Verwandte Fragen