Pergunta sobre android, android-ndk, c++ – Edifício Android NDK - Incluir LOCAL_SHARED_LIBRARIES?

10

Estou com problemas para criar um projeto no Android NDK. O mais provável é que seja devido a bibliotecas compartilhadas / estáticas adequadas não serem incluídas. Aqueles como -lsomeLib eu adicionei, mas aqueles como LOCAL_SHARED_LIBRARIES não estão sendo incluídos parece ...

Meu Android.mk contém o seguinte

LOCAL_SHARED_LIBRARIES + = libutils libmedia libz libbinder

Onde o ndk-build realmente procura essas bibliotecas?Se eu não incluir o -lutils -lmedia -lz -lbinder, não será possível obter o erro do vinculador. Tenho a sensação de que incluir apenas -LsomeDir e -lsomeLib não é a maneira correta de adicioná-los.

Aqui está o Android.mk completo.

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)

Um dos muitos erros relacionados especificamente a essas bibliotecas (por exemplo, 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':

Sua resposta

1   a resposta
7

-lmedia etc no seuLOCAL_LDLIBS argumentos.

1. Onde o ndk-build realmente procura por essas bibliotecas?

Se você procurar$NDK/docs/STABLE-APIS.html você verá que há um conjunto especificado de bibliotecas que você pode incluir dessa maneira. Nota:

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

Tendo me visto, nenhuma das bibliotecas que você especificou existe, embora eu tenha procurado apenas pela API-14.

2. Se eu não incluir o -lutils -lmedia -lz -lbinder, não consigo nem mesmo obter o erro do vinculador. Tenho a sensação de que incluir apenas -LsomeDir e -lsomeLib não é a maneira correta de adicioná-los.

Se suas bibliotecas são apenas bibliotecas c / c ++ regulares que você#include você deveria usarLOCAL_C_INCLUDES em vez de.

Observe também, a partir de$NDK/docs/ANDROID-MK.html:

O sistema de compilação manipula muitos detalhes para você. Por exemplo, você não precisa listar arquivos de cabeçalho ou dependências explícitas entre arquivos gerados em seu Android.mk. O sistema de compilação do NDK irá computá-los automaticamente para você.

Para usar outras bibliotecas no meu código nativo, eu simplesmente#include e especifique onde encontrar os cabeçalhos. Aqui é meuLOCAL_C_INCLUDES:

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

Eu espero que isso ajude.

Perguntas relacionadas