【问题标题】:Problems compiling VLC for Android - libvlcjni.so为 Android 编译 VLC 时出现问题 - libvlcjni.so
【发布时间】:2012-06-01 02:33:30
【问题描述】:

经过一天半的修改,我终于让 VLC 项目在 OS X 下几乎可以编译。当它即将链接 libvlcjni.so 时,我收到以下错误。大约还有 100 多个未定义的引用,但大多数都是少数函数:

std::__stl_throw_length_error(char const*) std::__node_alloc::_M_deallocate(void*, unsigned int)

有人指点吗?

编译拇指:vlcjni std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_compare(char const*, char const*, char const*, char const*)': /Android/ndk/sources/cxx-stl/stlport/stlport/stl/_string.h:1076: undefined reference tostd::__stl_throw_out_of_range(char const*)'

Application.mk

APP_PLATFORM := android-9
ifeq ($(NO_NEON),)
APP_ABI := armeabi-v7a
else ifneq ($(TEGRA2),)
APP_ABI := armeabi-v7a
else
APP_ABI := armeabi
endif

APP_STL := gnustl_static
APP_PLATFORM := android-9
APP_ABI := armeabi-v7a

Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

ifeq ($(NO_NEON),)
ARCH=armeabi-v7a
LOCAL_MODULE    := libvlcjni
else ifneq ($(TEGRA2),)
ARCH=armeabi-v7a
LOCAL_MODULE    := libvlcjni-tegra2
else
ARCH=armeabi
LOCAL_MODULE    := libvlcjni
endif

LOCAL_SRC_FILES := libvlcjni_danmaku.c aout.c pthread-condattr.c pthread-rwlocks.c eventfd.c sem.c

LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/include

ifeq ($(NO_NDK_V7),1)
CPP_STATIC=$(ANDROID_NDK)/sources/cxx-stl/gnu-libstdc++/libs/$(ARCH)/libstdc++.a
else
CPP_STATIC=$(ANDROID_NDK)/sources/cxx-stl/stlport/libs/$(ARCH)/libstlport_static.a
endif

LOCAL_CFLAGS := -std=gnu99
LOCAL_LDLIBS := -L$(VLC_CONTRIB)/lib \
    $(VLC_MODULES) \
    $(VLC_BUILD_DIR)/lib/.libs/libvlc.a \
    $(VLC_BUILD_DIR)/src/.libs/libvlccore.a \
    $(VLC_BUILD_DIR)/compat/.libs/libcompat.a \
    -ldl -lz -lm -llog \
    -ldvbpsi -lebml -lmatroska -ltag \
    -logg -lFLAC -ltheora \
    -lmpeg2 -ldca -la52 \
    -lavformat -lavcodec -lswscale -lavutil -lpostproc -lgsm -lopenjpeg \
    -lliveMedia -lUsageEnvironment -lBasicUsageEnvironment -lgroupsock \
    -lspeex -lspeexdsp \
    -lxml2 -lpng -lgnutls -lgcrypt -lgpg-error -lfreetype -liconv \
    $(CPP_STATIC) 

include $(BUILD_SHARED_LIBRARY)


include $(CLEAR_VARS)

LOCAL_MODULE     := libiomx-gingerbread
LOCAL_SRC_FILES  := ../$(VLC_SRC_DIR)/modules/codec/omxil/iomx.cpp
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/modules/codec/omxil $(ANDROID_SYS_HEADERS_GINGERBREAD)/frameworks/base/include $(ANDROID_SYS_HEADERS_GINGERBREAD)/system/core/include
LOCAL_LDLIBS     := -L$(ANDROID_LIBS) -lgcc -lstagefright -lmedia -lutils -lbinder

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE     := libiomx-hc
LOCAL_SRC_FILES  := ../$(VLC_SRC_DIR)/modules/codec/omxil/iomx.cpp
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/modules/codec/omxil $(ANDROID_SYS_HEADERS_HC)/frameworks/base/include $(ANDROID_SYS_HEADERS_HC)/frameworks/base/native/include $(ANDROID_SYS_HEADERS_HC)/system/core/include $(ANDROID_SYS_HEADERS_HC)/hardware/libhardware/include
LOCAL_LDLIBS     := -L$(ANDROID_LIBS) -lgcc -lstagefright -lmedia -lutils -lbinder

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE     := libiomx-ics
LOCAL_SRC_FILES  := ../$(VLC_SRC_DIR)/modules/codec/omxil/iomx.cpp
LOCAL_C_INCLUDES := $(VLC_SRC_DIR)/modules/codec/omxil $(ANDROID_SYS_HEADERS_ICS)/frameworks/base/include $(ANDROID_SYS_HEADERS_ICS)/frameworks/base/native/include $(ANDROID_SYS_HEADERS_ICS)/system/core/include $(ANDROID_SYS_HEADERS_ICS)/hardware/libhardware/include
LOCAL_LDLIBS     := -L$(ANDROID_LIBS) -lgcc -lstagefright -lmedia -lutils -lbinder

include $(BUILD_SHARED_LIBRARY)

【问题讨论】:

    标签: android c++ c vlc


    【解决方案1】:

    尝试将这些行包含到您的 Application.mk 中:

    APP_CPPFLAGS += -frtti 
    APP_CPPFLAGS += -fexceptions
    

    您必须明确启用 RTTI 和异常处理。

    编辑(响应您的修改):

    # These are your lines in Application.mk
    APP_PLATFORM := android-9
    ifeq ($(NO_NEON),)
    APP_ABI := armeabi-v7a
    else ifneq ($(TEGRA2),)
    APP_ABI := armeabi-v7a
    else
    APP_ABI := armeabi
    endif
    
    # Add these lines:
    APP_CPPFLAGS += -frtti 
    APP_CPPFLAGS += -fexceptions
    #  I haven't seen them
    

    【讨论】:

    • 感谢您的快速回复。问题是将这两个标志添加到 Application.mk 使 ndk-build 更早失败: SharedLibrary : libiomx-gingerbread.so ./obj/local/armeabi-v7a/objs-debug/iomx-gingerbread/__/__/./ vlc/modules/codec/omxil/iomx.o:在函数IOMXContext': /Users/kevin/Documents/workspace/vlc-android-macbuild/vlc-full-cortex-a9-vfpv3-d16/vlc-android/jni/../.././vlc/modules/codec/omxil/iomx.cpp:39: undefined reference to __cxa_end_cleanup'
    • 尝试添加“APP_STL := gnustl_static”。当然是 Application.mk
    • 还添加“APP_PLATFORM := android-7”以确保您使用的是不错的工具链/库。 "APP_ABI := armeabi-v7a" 可能也有帮助
    • 是的,添加这些标志似乎会导致 ndk-build 早些时候失败。共享库:libiomx-gingerbread.so ./obj/local/armeabi-v7a/objs-debug/iomx-gingerbread/__/__/./vlc/modules/codec/omxil/iomx.o:(.data.rel.ro +0x100): 未定义对 `typeinfo for android::BnOMXObserver' 的引用
    • 我实际上是针对不同的 STL 进行编译的。
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多