【问题标题】:Android NDK building - Include LOCAL_SHARED_LIBRARIES?Android NDK 构建 - 包括 LOCAL_SHARED_LIBRARIES?
【发布时间】:2012-06-14 19:27:00
【问题描述】:

我在使用 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':

【问题讨论】:

    标签: android c++ android-ndk


    【解决方案1】:

    在我看来,您不应该在 LOCAL_LDLIBS 参数中包含 -lmedia 等。

    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/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
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多