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) に関連する多くのエラーの 1 つです。

/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':
4

1 に答える 1

7

-lmedia引数に etc を含めるべきではないように思え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 だけを含めるのは、それらを追加する正しい方法ではないと感じています。

ライブラリが単なる通常の 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

これが役立つことを願っています。

于 2012-06-25T17:02:30.043 に答える