Bootstrap

Android 使用libyuv-编译

  1. 下载代码
    https://github.com/lemenkov/libyuv/

  2. 环境变量配置NDK地址

  3. 修改Android.mk文件,删除jpeg和test

  4. 新建application.mk

    #APP_ABI是用于指定编译哪个平台的库 , 可以写多个 用空格隔开 (libyuv默认吧所有平台都编了) 
    APP_ABI := arm64-v8a
    
    #APP_PLATFORM为指定android平台版本 差不多相当于SDK里面的targetSDKVersion
    APP_PLATFORM := android-23
    
    
  5. 进入下载目录,执行ndk-build

    Android NDK: Could not find application project directory !
    Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
    D:\sdk\ndk\21.4.7075529\build\\..\build\core\build-local.mk:151: *** Android NDK: Aborting    .  Stop.
    

    如上错误需要新建jni文件夹,source、jni、Android.mk、application.mk复制到jni,在jni目录下执行

  6. 下面错误需要启用对ARMv8.2-A架构的编译器支持,在Android.mk添加

    LOCAL_CFLAGS += -march=armv8.2-a+dotprod
    
    [arm64-v8a] Compile++      : yuv_static <= compare.cc
    [arm64-v8a] Compile++      : yuv_static <= compare_common.cc
    [arm64-v8a] Compile++      : yuv_static <= compare_gcc.cc
    [arm64-v8a] Compile++      : yuv_static <= compare_msa.cc
    [arm64-v8a] Compile++      : yuv_static <= compare_neon.cc
    [arm64-v8a] Compile++      : yuv_static <= compare_neon64.cc
    C:/Users/Desktop/libyuv-main/jni/source/compare_neon64.cc:175:8: error: instruction requires: dotprod
          "udot        v4.4s, v0.16b, v6.16b         \n"
           ^
    <inline asm>:14:1: note: instantiated into assembly here
    udot        v4.4s, v0.16b, v6.16b
    ^
    C:/Users/Desktop/libyuv-main/jni/source/compare_neon64.cc:176:8: error: instruction requires: dotprod
          "udot        v5.4s, v1.16b, v6.16b         \n"
           ^
    <inline asm>:15:1: note: instantiated into assembly here
    udot        v5.4s, v1.16b, v6.16b
    ^
    C:/Users/Desktop/libyuv-main/jni/source/compare_neon64.cc:204:8: error: instruction requires: dotprod
          "udot        v4.4s, v0.16b, v0.16b         \n"
           ^
    <inline asm>:10:1: note: instantiated into assembly here
    udot        v4.4s, v0.16b, v0.16b
    ^
    C:/Users/Desktop/libyuv-main/jni/source/compare_neon64.cc:205:8: error: instruction requires: dotprod
          "udot        v5.4s, v1.16b, v1.16b         \n"
           ^
    <inline asm>:11:1: note: instantiated into assembly here
    udot        v5.4s, v1.16b, v1.16b
    ^
    4 errors generated.
    
  7. 下面错误需要升级NDK版本>22

    C:/Users/Desktop/libyuv-main/jni/source/row_neon64.cc:2780:8: error: unrecognized instruction mnemonic, did you 
          mean: sdot, udot?                                                                                                    
          "usdot       v2.4s, v0.16b, v16.16b        \n"                                                                       
           ^                                                                                                                   
    <inline asm>:9:1: note: instantiated into assembly here                                                                    
    usdot       v2.4s, v0.16b, v16.16b                                                                                         
    ^                                                                                                                          
    C:/Users/Desktop/libyuv-main/jni/source/row_neon64.cc:2781:8: error: unrecognized instruction mnemonic, did you 
          mean: sdot, udot?                                                                                                    
          "usdot       v3.4s, v1.16b, v16.16b        \n"                                                                       
           ^                                                                                                                   
    <inline asm>:10:1: note: instantiated into assembly here                                                                   
    usdot       v3.4s, v1.16b, v16.16b                                                                                         
    ^                                                                                                                          
    C:/Users/Desktop/libyuv-main/jni/source/row_neon64.cc:2782:8: error: unrecognized instruction mnemonic, did you 
          mean: sdot, udot?                                                                                                    
          "usdot       v4.4s, v0.16b, v17.16b        \n"                                                                       
           ^                                                                                                                   
    <inline asm>:11:1: note: instantiated into assembly here                                                                   
    usdot       v4.4s, v0.16b, v17.16b                                                                                         
    
  8. 编译动态库出错,需要在Android.mk添加定义宏DLIBYUV_DISABLE_SVE

    ld: error: undefined symbol: AYUVToUVRow_SVE2
    >>> referenced by convert.cc:1790 (source/convert.cc:1790)
    >>>               C:/Users/Desktop/libyuv-main/obj/local/arm64-v8a/objs/yuv_library/source/convert.o:(AYUVToNV12)
    >>> referenced by convert.cc:1790 (source/convert.cc:1790)
    >>>               C:/Users/Desktop/libyuv-main/obj/local/arm64-v8a/objs/yuv_library/source/convert.o:(AYUVToNV12)
    >>> referenced by row_any.cc:2482 (source/row_any.cc:2482)
    >>>               C:/Users/Desktop/libyuv-main/obj/local/arm64-v8a/objs/yuv_library/source/row_any.o:(AYUVToUVRow_Any_SVE2)
    >>> referenced 1 more times
    
    ld: error: undefined symbol: AYUVToVURow_SVE2
    >>> referenced by convert.cc:1867 (source/convert.cc:1867)
    >>>               C:/Users/Desktop/libyuv-main/obj/local/arm64-v8a/objs/yuv_library/source/convert.o:(AYUVToNV21)
    >>> referenced by convert.cc:1867 (source/convert.cc:1867)
    >>>               C:/Users/Desktop/libyuv-main/obj/local/arm64-v8a/objs/yuv_library/source/convert.o:(AYUVToNV21)
    >>> referenced by row_any.cc:2485 (source/row_any.cc:2485)
    >>>               C:/Users/Desktop/libyuv-main/obj/local/arm64-v8a/objs/yuv_library/source/row_any.o:(AYUVToVURow_Any_SVE2)
    >>> referenced 1 more times
    
  9. 完整Android.mk

    # This is the Android makefile for libyuv for NDK.
    LOCAL_PATH:= $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_CPP_EXTENSION := .cc
    
    LOCAL_SRC_FILES := \
        source/compare.cc           \
        source/compare_common.cc    \
        source/compare_gcc.cc       \
        source/compare_msa.cc       \
        source/compare_neon.cc      \
        source/compare_neon64.cc    \
        source/compare_win.cc       \
        source/convert.cc           \
        source/convert_argb.cc      \
        source/convert_from.cc      \
        source/convert_from_argb.cc \
        source/convert_to_argb.cc   \
        source/convert_to_i420.cc   \
        source/cpu_id.cc            \
        source/planar_functions.cc  \
        source/rotate.cc            \
        source/rotate_any.cc        \
        source/rotate_argb.cc       \
        source/rotate_common.cc     \
        source/rotate_gcc.cc        \
        source/rotate_msa.cc        \
        source/rotate_neon.cc       \
        source/rotate_neon64.cc     \
        source/rotate_win.cc        \
        source/row_any.cc           \
        source/row_common.cc        \
        source/row_gcc.cc           \
        source/row_msa.cc           \
        source/row_neon.cc          \
        source/row_neon64.cc        \
        source/row_win.cc           \
        source/scale.cc             \
        source/scale_any.cc         \
        source/scale_argb.cc        \
        source/scale_common.cc      \
        source/scale_gcc.cc         \
        source/scale_msa.cc         \
        source/scale_neon.cc        \
        source/scale_neon64.cc      \
        source/scale_rgb.cc         \
        source/scale_uv.cc          \
        source/scale_win.cc         \
        source/video_common.cc
    
    common_CFLAGS := -Wall -fexceptions -march=armv8.4-a+dotprod+i8mm -DLIBYUV_DISABLE_SVE=1
    
    LOCAL_CFLAGS += $(common_CFLAGS)
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
    LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
    
    LOCAL_MODULE := libyuv_library
    LOCAL_MODULE_TAGS := optional
    
    include $(BUILD_SHARED_LIBRARY)
    
;