2013-08-30 31 views
2

我正在ffmpeg上工作,我想爲ffmpeg編寫Jni包裝,我可以調用ffmpeg avcodec類的decode_video方法。我得到了未定義的參考'avcodec_register_all'Ffmpeg on android

Swap:SwapFfmpeg swap$ ndk-build 
Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml  
Compile thumb : com_example_swapffmpeg_Jffmpeg <= com_example_swapffmpeg_Jffmpeg.c 
SharedLibrary : libcom_example_swapffmpeg_Jffmpeg.so 
/Users/swap/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-  x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/com_example_swapffmpeg_Jffmpeg/com_example_swapffmpeg_Jffmpeg.o: in function Java_com_example_swapffmpeg_Jffmpeg_videoinfo:jni/com_example_swapffmpeg_Jffmpeg.c:14: error: undefined reference to 'avcodec_register_all' 
collect2: ld returned 1 exit status 
make: *** [obj/local/armeabi/libcom_example_swapffmpeg_Jffmpeg.so] Error 1 

我創建了android.mk文件,並將其鏈接到c包裝類和libffmpeg.so文件。 但是,當我嘗試建立它avcodec_register_all

我在谷歌搜索顯示錯誤,我發現2解決方案

1)一個是外部C {},但我使用.c文件不是C++,所以我不認爲所以我需要使用的extern {}

2)第二個是增加

LOCAL_LDLIBS := -L/Users/swap/android-ndk-r9/platforms/arch-arm/usr/lib -L$(LOCAL_PATH) -lavformat -lavcodec -lavdevice -lavfilter -lavutil -lswscale -lz -ldl -lgcc 

我已經加入到這個我android.mk和我得到這個error.anybody能告訴我我應該怎麼寫的infornt Local_LDLIBS和爲什麼寫這個?

/Users/swap/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/com_example_swapffmpeg_Jffmpeg/com_example_swapffmpeg_Jffmpeg.o: in function Java_com_example_swapffmpeg_Jffmpeg_videoinfo:jni/com_example_swapffmpeg_Jffmpeg.c:14: error: undefined reference to 'avcodec_register_all'collect2: ld returned 1 exit status 

在這個錯誤爲什麼它總是去工具鏈?但在android.mk我提供平臺/弓臂的鐵桿路徑/

這裏是我的android.mk

LOCAL_PATH:=$(call my-dir) 
#declare the prebuilt library 
include $(CLEAR_VARS) 
LOCAL_MODULE := ffmpeg-prebuilt 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/libffmpeg.so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include 
LOCAL_LDLIBS := -L/Users/swap/android-ndk-r9/platforms/arch-arm/usr/lib -  L$(LOCAL_PATH) -lavformat -lavcodec -lavdevice -lavfilter -lavutil -lswscale -lz -ldl -lgcc 
LOCAL_PRELINK_MODULE := true 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE:=com_example_swapffmpeg_Jffmpeg  
LOCAL_SRC_FILES:=com_example_swapffmpeg_Jffmpeg.c 
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt 
include $(BUILD_SHARED_LIBRARY) 

回答

1

我不知道這會工作或沒有,但你可以試試這個

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libavcodec 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_MODULE := libavdevice 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libavfilter 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libavformat 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libavutil 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libswscale 
LOCAL_SRC_FILES := ffmpeg/$(TARGET_ARCH_ABI)/lib/$(LOCAL_MODULE).so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg/$(TARGET_ARCH_ABI)/include 
include $(PREBUILT_SHARED_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_MODULE:=com_example_swapffmpeg_Jffmpeg  
LOCAL_SRC_FILES:=com_example_swapffmpeg_Jffmpeg.c 
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt 
include $(BUILD_SHARED_LIBRARY) 


include $(CLEAR_VARS) 

LOCAL_MODULE := com_example_swapffmpeg_Jffmpeg 
LOCAL_SRC_FILES := com_example_swapffmpeg_Jffmpeg.c 
LOCAL_SHARED_LIBRARIES := libavdevice libavfilter libavutil libswscale libavformat 
LOCAL_LDLIBS := -L/Users/swapnil/android-ndk-r9/platforms/$(TARGET_PLATFORM)/arch-arm/usr/lib \ 
      -L$(LOCAL_PATH)/lib/ffmpeg/$(TARGET_ARCH_ABI)/lib \ 
      -lavformat \ 
      -lavcodec \ 
      -lavdevice \ 
      -lavfilter \ 
      -lavutil \ 
      -lswscale \ 
      -llog \ 
      -lz \ 
      -ldl \ 
      -lgcc 

include $(BUILD_SHARED_LIBRARY)