Android NDK构建 - 包括LOCAL_SHARED_LIBRARIES?

时间:2012-06-11 21:28:11

标签: android c++ android-ndk

我在使用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不是添加它们的正确方法。
  3. 这是完整的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 个答案:

答案 0 :(得分:7)

在我看来,您不应该在-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不是添加它们的正确方法。

如果您的库只是#include的常规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

我希望这会有所帮助。