Android NDK构建 - 包括LOCAL_SHARED_LIBRARIES?

11

我在使用Android NDK构建项目时遇到了问题。最可能是由于未包含正确的共享/静态库导致的。我添加了-lsomeLib这样的库,但是似乎没有添加LOCAL_SHARED_LIBRARIES这样的库...

我的Android.mk文件包含以下内容:

LOCAL_SHARED_LIBRARIES += libutils libmedia libz libbinder

  1. ndk-build实际上在哪里查找这些库?
  2. 如果我不包括-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个回答

7

在你的LOCAL_LDLIBS参数中,我认为你不应该包含-lmedia等内容。

1. ndk-build实际上在哪里查找这些库?

如果你查看$NDK/docs/STABLE-APIS.html,你会发现有一组指定的库可以用这种方式包含。注意:

相应API级别的头文件现在位于$NDK/platforms/android-<level>/arch-arm/usr/include下。

我自己查看了一下,你指定的库都不存在那里,尽管我只查看了API-14。


2. 如果我不包括-lutils -lmedia -lz -lbinder,甚至无法到达链接器错误。我有一种感觉,仅包括-LsomeDir和-lsomeLib并不是添加它们的正确方式。

如果你的库只是普通的C/C++库,你应该使用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

我希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接