libjpeg-turbo для андроид

Мне нужен http://www.libjpeg-turbo.org/ для Android ndk. Кому-нибудь удалось скомпилировать его как.a (статическую) lib? Я пробовал несколько раз, но это дало мне только много ошибок.

4 ответа

Решение

Установите Android NDK. Следующие инструкции были проверены с r8b, более старые версии могут иметь проблемы, я не знаю.

Получите исходные коды Android для libjpeg-turbo от Benjamin Gaignard:

git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android

В каталоге libjpeg-turbo, созданном git, отредактируйте файл Android.mk: после строки 70, LOCAL_MODULE := libjpegдобавьте следующее:

ifeq ($(notdir $(MAKECMDGOALS)),libjpeg.a)
  LOCAL_SRC_FILES +=  $(libsimd_SOURCES_DIST)
  include $(BUILD_STATIC_LIBRARY)
  include $(CLEAR_VARS)
  LOCAL_MODULE := dummy
endif

Запустите ndk-build:

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk obj/local/armeabi/libjpeg.a

Прибыль!

PS: Вы можете захотеть версию armeabi-v7a:

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi-v7a obj/local/armeabi-v7a/libjpeg.a

Или скомпилируйте для ARM, чтобы улучшить производительность, добавьте в командную строку:

LOCAL_ARM_MODE=arm

Если ваша цель поддерживает NEON, добавьте в командную строку:

LOCAL_ARM_NEON=true ARCH_ARM_HAVE_NEON=true

ОБНОВЛЕНИЕ: чтобы заставить его работать с Android NDK r15 и позже, удалите все ссылки на libcutils с Android.mk.

Этот ответ расширяет ответ Алекса Кона. Полная заслуга ему за то, что я начал. Этот ответ позволит вам собрать libjpeg-turbo со сборкой для ARM (с NEON или без), а также для x86. Совместимость также предоставляется для MIPS, так что вы можете быть хорошим гражданином и создавать свое приложение для всех платформ, поддерживаемых версией Android NDK r8e.

Я по-прежнему относительный новичок к тому, чтобы фактически отвечать на вопросы, поэтому у меня нет прав на включение вложений. Так что мне придется встроить кучу кода. Я также уверен, что есть лучшие способы сделать кусочки из нижеприведенного, поэтому я открыт для предложений по улучшению.

Чтобы заставить все это работать, было сделано шесть основных шагов (второй шаг состоит из множества подэтапов, каждый из которых можно найти после шести основных шагов):

  1. Загрузите через git библиотеку libjpeg-turbo, содержащую набор кода и файлов.mk для Android. Я скачал его отсюда с помощью git:

    git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android
    

    Полная благодарность и благодарность должны быть отданы Тому Галлу за выполнение начальной работы.

  2. Загрузите YASM (ассемблер для x86) и настройте среду сборки Android для его поддержки. См. Набор инструкций по настройке YASM для Android NDK, который я включил, ниже горизонтального правила в конце моих изменений Android.mk на шаге 6. Поддержка x86 требует, чтобы вы не стеснялись настраивать установку NDK.

    Возможно, я мог бы использовать компилятор NASM, но был достаточно далеко по пути YASM, прежде чем исследовать NASM, чтобы я завершил путь YASM.

  3. Создайте файл simd/jsmidcfg.inc. Библиотека libjpeg-turbo предоставляет simd/jsmidcfg.inc.h. Предполагается, что препроцессор возьмет.h и преобразует его в.inc. Я уверен, что есть лучший способ, чтобы это произошло, чем то, что я сделал. Но не смог разобраться из-за нехватки времени. Вместо этого я вручную запустил один gcc, который шел с Android, чтобы создать файл, используя следующую команду:

    C:\development\android\ide\android-ndk-r8e-windows-x86_64\toolchains\x86-4.4.3\prebuilt\windows-x86_64\bin\i686-linux-android-gcc.exe -E C:\development\thirdparty\libjpeg-turbo\libjpeg-turbo-android-1.2.0\simd\jsimdcfg.inc.h -o C:\development\thirdparty\libjpeg-turbo\libjpeg-turbo-android1.2.0\simd\jsimdcfg.inc
    

    После завершения препроцессора мне пришлось вручную отредактировать файл, чтобы привести его в рабочее состояние. Мне пришлось выбрать все строки выше "; - jpeglib.h" и удалить их.

    Затем мне нужно было найти каждый из определений%, которые начинаются с _cpp_protection_, и продублировать каждый из этих определений% БЕЗ _cpp_protection_. Например, %define _cpp_protection_RGB_RED 0 стал %define RGB_RED 0

  4. Что касается ARM, я хотел, чтобы мой код динамически поддерживал инструкции NEON на оборудовании, на котором оно было, и откатился к чему-то более простому на оборудовании, на котором его нет, я изменил simd/jsimd_arm.c для динамического запроса информации. Я не хотел делать такой выбор при сборке libjpeg-turbo.

    Я добавил следующие строки кода:

    #ifdef ANDROID
    #include <cpufeatures/cpu-features.h>
    #endif
    

    а также

    #ifdef ANDROID
      uint64_t cpuFeatures = android_getCpuFeatures();
      if (cpuFeatures & ANDROID_CPU_ARM_FEATURE_NEON) {
         simd_support |= JSIMD_ARM_NEON;
      }
    #endif
    

    в методе init_simd ().

  5. Включение MIPS.

    Чтобы быть хорошим гражданином, я хотел включить компиляцию на MIPS. Хотя для MIPS нет ассемблерного кода, он должен по крайней мере компилироваться и запускаться. Для этого я скопировал simd/jsimd_arm.c в simd/jsimd_mips.c. Я отредактировал файл так, чтобы init_simd() задавать simd_support = 0; Я также изменил все jsimd_can_*() методы для возврата 0. Наконец, я удалил реализацию из всех других методов.

  6. Поскольку меня интересовало нечто большее, чем просто сборка для ARM, я изменил файл Application.mk, добавив в него следующие строки:

    APP_ABI := all
    APP_OPTIM := release
    

    APP_OPTIM прибывает из Как оптимизировать нативный код с android-ndk (Оптимизация Скорости)

    В Android.mk я закомментировал все из блока комментариев "cjpeg" и ниже. Чтобы сделать блочный комментарий, я последовал совету Как добавить многострочные комментарии в make-файлы

    Затем я настроил сам файл Android.mk для сборки всех поддерживаемых в настоящее время процессоров (ARM, x86, MIPS). Вот что я закончил (некоторый код закомментирован, потому что я хотел статическую библиотеку - также оставить исходный код на месте, чтобы я мог видеть, что изменилось). Скорее всего, вам придется изменить (или удалить) вызовы метода addprefix, поскольку приведенный ниже файл настроен для моей среды сборки. Но кроме этого, это должно работать для вас.

,

##################################################
###                simd                        ###
##################################################
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

#ifeq ($(ARCH_ARM_HAVE_NEON),true)
#LOCAL_CFLAGS += -D__ARM_HAVE_NEON
#endif

# From autoconf-generated Makefile
EXTRA_DIST = simd/nasm_lt.sh simd/jcclrmmx.asm simd/jcclrss2.asm simd/jdclrmmx.asm simd/jdclrss2.asm \
simd/jdmrgmmx.asm simd/jdmrgss2.asm simd/jcclrss2-64.asm simd/jdclrss2-64.asm \
simd/jdmrgss2-64.asm simd/CMakeLists.txt

#libsimd_SOURCES_DIST = simd/jsimd_arm_neon.S \
                       simd/jsimd_arm.c

libsimd_SOURCES_DIST :=


ifeq ($(TARGET_ARCH),arm)
libsimd_SOURCES_DIST := simd/jsimd_arm_neon.S \
                       simd/jsimd_arm.c
endif

ifeq ($(TARGET_ARCH),x86)
#libsimd_SOURCES_DIST := simd/jsimd_mips.c

# List of assembly files needed is derived from content within simd/CMakelists.txt
# The Intel Atom supports x86 32-bit assembly.  So take those files and leave the
# 64-bit behind.

libsimd_SOURCES_DIST := simd/jsimd_i386.c \
simd/jsimdcpu.asm simd/jccolmmx.asm simd/jcgrammx.asm simd/jdcolmmx.asm simd/jcsammmx.asm simd/jdsammmx.asm \
    simd/jdmermmx.asm simd/jcqntmmx.asm simd/jfmmxfst.asm simd/jfmmxint.asm simd/jimmxred.asm simd/jimmxint.asm simd/jimmxfst.asm simd/jcqnt3dn.asm \
    simd/jf3dnflt.asm simd/ji3dnflt.asm simd/jcqntsse.asm simd/jfsseflt.asm simd/jisseflt.asm simd/jccolss2.asm simd/jcgrass2.asm simd/jdcolss2.asm \
    simd/jcsamss2.asm simd/jdsamss2.asm simd/jdmerss2.asm simd/jcqnts2i.asm simd/jfss2fst.asm simd/jfss2int.asm simd/jiss2red.asm simd/jiss2int.asm \
    simd/jiss2fst.asm simd/jcqnts2f.asm simd/jiss2flt.asm
endif

ifeq ($(TARGET_ARCH),mips)
libsimd_SOURCES_DIST := simd/jsimd_mips.c
endif


#LOCAL_SRC_FILES := $(libsimd_SOURCES_DIST)
#LOCAL_SRC_FILES := $(addprefix ../../libjpeg-turbo-android-1.2.0/,$(LOCAL_SRC_FILES))

LOCAL_C_INCLUDES := $(LOCAL_PATH)/simd \
                    $(LOCAL_PATH)/android

LOCAL_C_INCLUDES := simd android
#LOCAL_C_INCLUDES := $(addprefix ../../libjpeg-turbo-android-1.2.0/,$(LOCAL_C_INCLUDES))


#AM_CFLAGS := -march=armv7-a -mfpu=neon
#AM_CCASFLAGS := -march=armv7-a -mfpu=neon

#LOCAL_MODULE_TAGS := debug

#LOCAL_MODULE := libsimd

#include $(BUILD_STATIC_LIBRARY)

######################################################
###           libjpeg.so                       ##
######################################################

#include $(CLEAR_VARS)

# From autoconf-generated Makefile
libjpeg_SOURCES_DIST =  jcapimin.c jcapistd.c jccoefct.c jccolor.c \
        jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
        jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c \
        jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
        jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
        jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c \
        jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c \
        jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c \
jaricom.c jcarith.c jdarith.c \
turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c #\
turbojpeg-mapfile

LOCAL_SRC_FILES:= $(libjpeg_SOURCES_DIST) $(libsimd_SOURCES_DIST)
#LOCAL_SRC_FILES:= $(libjpeg_SOURCES_DIST)
LOCAL_SRC_FILES := $(addprefix ../../../libjpeg-turbo-android-1.2.0/,$(LOCAL_SRC_FILES))

#LOCAL_SHARED_LIBRARIES := libcutils
#LOCAL_STATIC_LIBRARIES := libsimd

#LOCAL_C_INCLUDES := $(LOCAL_PATH) 

# Include C:/development/android/ide/android-ndk-r8e-windows-x86_64/sources/android
# instead of the lower-level cpufeatures because of how I had to include
# cpu-features.h.  It appears as if there is a naming conflict, so I had to
# change how the file was included to avoid naming conflicts.

LOCAL_C_INCLUDES := $(addprefix ../../../libjpeg-turbo-android-1.2.0/,$(LOCAL_C_INCLUDES)) \
C:/development/thirdparty/libjpeg-turbo/libjpeg-turbo-android-1.2.0 \
C:/development/android/ide/android-ndk-r8e-windows-x86_64/sources/android
#LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES)) ./
#LOCAL_C_INCLUDES := $(addprefix $(LOCAL_PATH),$(LOCAL_C_INCLUDES)) $(LOCAL_PATH)../../../libjpeg-turbo-android-1.2.0/

LOCAL_CFLAGS := -DAVOID_TABLES  -O3 -fstrict-aliasing -fprefetch-loop-arrays  -DANDROID \
        -DANDROID_TILE_BASED_DECODE -DENABLE_ANDROID_NULL_CONVERT
LOCAL_CFLAGS += -DJPEG_LIB_VERSION=80  # I need version 8 because of some of the methods I depend on
LOCAL_YASMFLAGS := -P../../libjpeg-turbo-android-1.2.0/simd/jsimdcfg.inc

#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_STATIC_LIBRARY)

#LOCAL_MODULE_TAGS := debug

#LOCAL_MODULE := libjpeg
LOCAL_MODULE := jpeg-turbo

#include $(BUILD_SHARED_LIBRARY)
#LOCAL_STATIC_LIBRARIES := cpufeatures

include $(BUILD_STATIC_LIBRARY)

# We reference android/cpufeatures in the Android.mk file of our main app, so
# we don't need to do anything here.
#$(call import-module,android/cpufeatures)

Часть исходного кода, поставляемого с libjpeg-turbo, имеет формат.asm. То есть его нужно скомпилировать с помощью ассемблера NASM. На момент выпуска Android NDK не поддерживает его.

Чтобы получить поддержку.asm для работы с NDK, я следовал наброску, представленному здесь: http://software.intel.com/en-us/articles/using-yasm-compiler-on-android-ndkbuild

Вот набор более подробных инструкций. Внутри android-ndk-r8\build\core должны произойти следующие вещи:

  1. build-binary.mk:

    all_source_extensions := .c .s .S $(LOCAL_CPP_EXTENSION) => all_source_extensions := .c .s .asm .S $(LOCAL_CPP_EXTENSION)

    Для меня вышеупомянутое было на линии 228.

    После строки, которая начинается с: "# Построить исходные файлы для объектных файлов", вы увидите несколько циклов foreach. Добавьте такой (я добавил его в строке 272):

    $(foreach src,$(filter %.asm,$(LOCAL_SRC_FILES)), $(call compile-asm-source,$(src),$(call get-object-name,$(src))))
    
  2. definitions.mk:

    Создайте новый compile-asm-source, чтобы соответствовать новой записи, которую мы добавили в цикле new for выше. Мы также должны добавить новое определение в файл make. Я добавил следующее. Это сочетание и упрощение различных правил, используемых для создания файлов.c. Нам нужен другой набор опций при использовании yasm, которые требуют этих изменений.

    define  ev-compile-asm-source
    _SRC:=$$(LOCAL_PATH)/$(1)
    _OBJ:=$$(LOCAL_OBJS_DIR)/$(2)
    
    _FLAGS := -f elf -DELF -DPIC $$(LOCAL_YASMFLAGS)
    
    _TEXT := "Compile $$(call get-src-file-text,$1)"
    _CC   := $$(NDK_CCACHE) $$(TARGET_ASM)
    
    $$(_OBJ): PRIVATE_SRC      := $$(_SRC)
    $$(_OBJ): PRIVATE_OBJ      := $$(_OBJ)
    $$(_OBJ): PRIVATE_DEPS     := $$(call host-path,$$(_OBJ).d)
    $$(_OBJ): PRIVATE_MODULE   := $$(LOCAL_MODULE)
    $$(_OBJ): PRIVATE_TEXT     := "$$(_TEXT)"
    $$(_OBJ): PRIVATE_CC       := $$(_CC)
    $$(_OBJ): PRIVATE_CFLAGS   := $$(_FLAGS)
    
    ifeq ($$(LOCAL_SHORT_COMMANDS),true)
    _OPTIONS_LISTFILE := $$(_OBJ).cflags
    $$(_OBJ): $$(call generate-list-file,$$(_FLAGS),$$(_OPTIONS_LISTFILE))
    $$(_OBJ): PRIVATE_CFLAGS := @$$(call host-path,$$(_OPTIONS_LISTFILE))
    $$(_OBJ): $$(_OPTIONS_LISTFILE)
    endif
    
    $$(call generate-file-dir,$$(_OBJ))
    
    $$(_OBJ): $$(_SRC) $$(LOCAL_MAKEFILE) $$(NDK_APP_APPLICATION_MK) $$(NDK_DEPENDENCIES_CONVERTER)
    @$$(HOST_ECHO) "$$(PRIVATE_TEXT)  : $$(PRIVATE_MODULE) <= $$(notdir $$(PRIVATE_SRC))"
    $$(hide) $$(PRIVATE_CC) $$(PRIVATE_CFLAGS) $$(call host-path,$$(PRIVATE_SRC)) -o $$(call host-path,$$(PRIVATE_OBJ)) \
    $$(call cmd-convert-deps,$$(PRIVATE_DEPS))
    endef
    
    compile-asm-source = $(eval $(call ev-compile-asm-source,$1,$2))
    

    Найдите строку, которая начинается с 'compile-s-source'. Я нашел его в строке 1491. Новый compile-asm-source может идти прямо под этим.

    Затем ищите строку, которая начинается с "get-object-name". Я нашел его в строке 1270. Добавьте ".asm" во внутренний цикл for. Поместите его вместе с.c, .s и.S

  3. import-locals.mk:

    Добавьте следующую строку ниже LOCAL_CFLAGS и LOCAL_CPPFLAGS

    LOCAL_YASMFLAGS  := $(LOCAL_CFLAGS) $(strip $(LOCAL_YASMFLAGS))
    
  4. default-build-commands.mk:

    Добавьте следующую строку в любом месте файла. Я поместил свой в раздел TARGET_CXX и выше раздела TARGET_LD.

    TARGET_ASM       = $(TOOLCHAIN_PREFIX)yasm
    
  5. Загрузите и скопируйте yasm.exe в папки сборки:

    Загрузите копию YASM здесь: http://yasm.tortall.net/

    У меня есть версия NDK для Win64, поэтому я скачал версию YASM для Win64. Если у вас есть версия NDS для Win32, загрузите версию YASM для Win32.

    Вы должны просто получить.exe. Скопируйте его в следующие каталоги как yasm.exe. Если у вас есть другие версии набора инструментов, скопируйте их также в эти каталоги:

    C:\development\android\ide\android-ndk-r8e-windows-x86_64\toolchains\x86-4.4.3\prebuilt\windows-x86_64\i686-linux-android\bin
    
    C:\development\android\ide\android-ndk-r8e-windows-x86_64\toolchains\x86-4.6\prebuilt\windows-x86_64\i686-linux-android\bin
    
    C:\development\android\ide\android-ndk-r8e-windows-x86_64\toolchains\x86-4.7\prebuilt\windows-x86_64\i686-linux-android\bin
    

    Затем скопируйте файл снова в каталоги ниже как i686-linux-android-yasm.exe. И, как указано выше, если у вас есть другие версии набора инструментов, скопируйте их также в эти каталоги:

    C:\development\android\ide\android-ndk-r8e-windows-x86_64\toolchains\x86-4.4.3\prebuilt\windows-x86_64\bin
    
    C:\development\android\ide\android-ndk-r8e-windows-x86_64\toolchains\x86-4.6\prebuilt\windows-x86_64\bin
    
    C:\development\android\ide\android-ndk-r8e-windows-x86_64\toolchains\x86-4.7\prebuilt\windows-x86_64\bin
    

Спасибо Алекс Кон и ответил Декарь за акцию;

Этот ответ расширяет ответ Алекса Кона и отвечает ответом декабря.

Я использую jpeg turbo 1.3.9, ndk-r9d, о yasm.exe, ndk-r9d содержится, после того как я ответил на шаг 3 декабря, у меня была одна ошибка в строке simd/jsimdext.inc:182 "%define EXTN(имя) _ %+ имя; foo() -> _foo"; измените его на "% определить имя EXTN (имя)"; тогда хорошо, эта проблема была исправлена;

это мой Android.mk

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

LOCAL_CFLAGS += -D__ARM_HAVE_NEON

#ifeq ($(ARCH_ARM_HAVE_NEON),true)
#LOCAL_CFLAGS += -D__ARM_HAVE_NEON
#endif

# From autoconf-generated Makefile
EXTRA_DIST = nasm_lt.sh CMakeLists.txt \
    jccolext-mmx.asm   jcgryext-mmx.asm   jdcolext-mmx.asm   jdmrgext-mmx.asm \
    jccolext-sse2.asm  jcgryext-sse2.asm  jdcolext-sse2.asm  jdmrgext-sse2.asm \
    jccolext-sse2-64.asm  jcgryext-sse2-64.asm  jdcolext-sse2-64.asm \
    jdmrgext-sse2-64.asm



ifeq ($(TARGET_ARCH),arm)
libsimd_SOURCES_DIST := simd/jsimd_arm_neon.S \
                       simd/jsimd_arm.c

AM_CFLAGS := -march=armv7-a -mfpu=neon
AM_CCASFLAGS := -march=armv7-a -mfpu=neon

endif

ifeq ($(TARGET_ARCH),x86)
# List of assembly files needed is derived from content within simd/CMakelists.txt
# The Intel Atom supports x86 32-bit assembly.  So take those files and leave the
# 64-bit behind.

#libsimd_SOURCES_DIST := simd/jsimd_i386.c \
    simd/jsimdcpu.asm \
    simd/jfdctflt-3dn.asm \
    simd/jidctflt-3dn.asm \
    simd/jquant-3dn.asm \
    simd/jccolor-mmx.asm \
    simd/jcgray-mmx.asm \
    simd/jcsample-mmx.asm \
    simd/jdcolor-mmx.asm \
    simd/jdmerge-mmx.asm \
    simd/jdsample-mmx.asm \
    simd/jfdctfst-mmx.asm \
    simd/jfdctint-mmx.asm \
    simd/jidctfst-mmx.asm \
    simd/jidctint-mmx.asm \
    simd/jidctred-mmx.asm \
    simd/jquant-mmx.asm \
    simd/jfdctflt-sse.asm \
    simd/jidctflt-sse.asm \
    simd/jquant-sse.asm \
    simd/jccolor-sse2.asm \
    simd/jcgray-sse2.asm \
    simd/jcsample-sse2.asm \
    simd/jdcolor-sse2.asm \
    simd/jdmerge-sse2.asm \
    simd/jdsample-sse2.asm \
    simd/jfdctfst-sse2.asm \
    simd/jfdctint-sse2.asm \
    simd/jidctflt-sse2.asm \
    simd/jidctfst-sse2.asm \
    simd/jidctint-sse2.asm \
    simd/jidctred-sse2.asm \
    simd/jquantf-sse2.asm \
    simd/jquanti-sse2.asm

libsimd_SOURCES_DIST := simd/jsimd_i386.c simd/jsimd.h simd/jsimdcfg.inc.h simd/jsimdext.inc \
    simd/jcolsamp.inc simd/jdct.inc simd/jsimdcpu.asm \
    simd/jfdctflt-3dn.asm   simd/jidctflt-3dn.asm   simd/jquant-3dn.asm \
    simd/jccolor-mmx.asm    simd/jcgray-mmx.asm     simd/jcsample-mmx.asm \
    simd/jdcolor-mmx.asm    simd/jdmerge-mmx.asm    simd/jdsample-mmx.asm \
    simd/jfdctfst-mmx.asm   simd/jfdctint-mmx.asm   simd/jidctfst-mmx.asm \
    simd/jidctint-mmx.asm   simd/jidctred-mmx.asm   simd/jquant-mmx.asm \
    simd/jfdctflt-sse.asm   simd/jidctflt-sse.asm   simd/jquant-sse.asm \
    simd/jccolor-sse2.asm   simd/jcgray-sse2.asm    simd/jcsample-sse2.asm \
    simd/jdcolor-sse2.asm   simd/jdmerge-sse2.asm   simd/jdsample-sse2.asm \
    simd/jfdctfst-sse2.asm  simd/jfdctint-sse2.asm  simd/jidctflt-sse2.asm \
    simd/jidctfst-sse2.asm  simd/jidctint-sse2.asm  simd/jidctred-sse2.asm  \
    simd/jquantf-sse2.asm   simd/jquanti-sse2.asm
endif

ifeq ($(TARGET_ARCH),mips)
libsimd_SOURCES_DIST := simd/jsimd_mips.c
endif

LOCAL_C_INCLUDES := $(LOCAL_PATH)/simd \
                    $(LOCAL_PATH)/android

LOCAL_SRC_FILES:= $(libsimd_SOURCES_DIST)

LOCAL_CFLAGS := -DAVOID_TABLES  -O3 -fstrict-aliasing -fprefetch-loop-arrays  -DANDROID \
        -DANDROID_TILE_BASED_DECODE -DENABLE_ANDROID_NULL_CONVERT
LOCAL_CFLAGS += -DJPEG_LIB_VERSION=80  # I need version 8 because of some of the methods I depend on

$(warning "libsimd")
LOCAL_MODULE := libsimd
LOCAL_MODULE_FILENAME := libsimd
include $(BUILD_STATIC_LIBRARY)

######################################################
###           libjpeg.so                       ##
######################################################

#include $(CLEAR_VARS)

# From autoconf-generated Makefile
libjpeg_SOURCES_DIST =  jcapimin.c jcapistd.c jccoefct.c jccolor.c \
        jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
        jcomapi.c jcparam.c jcphuff.c jcprepct.c jcsample.c jctrans.c \
        jdapimin.c jdapistd.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
        jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
        jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c \
        jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c \
        jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c \
    jaricom.c jcarith.c jdarith.c \
    turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c \
    turbojpeg-mapfile

LOCAL_SRC_FILES:= $(libjpeg_SOURCES_DIST)

LOCAL_SHARED_LIBRARIES += libcutils
LOCAL_STATIC_LIBRARIES += libsimd

LOCAL_C_INCLUDES := $(LOCAL_PATH) 



$(warning "libjpeg")

LOCAL_CFLAGS := -DAVOID_TABLES  -O3 -fstrict-aliasing -fprefetch-loop-arrays  -DANDROID \
        -DANDROID_TILE_BASED_DECODE -DENABLE_ANDROID_NULL_CONVERT
LOCAL_CFLAGS += -DJPEG_LIB_VERSION=80  # I need version 8 because of some of the methods I depend on

#D:\android-ndk-r9d\toolchains\x86-4.8\prebuilt\windows-x86_64\bin\i686-linux-android-gcc.exe -E D:\WORKSPACE\MINE\libjpeg_turbo_1.3.9_multi_platform\jni\simd\jsimdcfg.inc.h -o D:\WORKSPACE\MINE\libjpeg_turbo_1.3.9_multi_platform\jni\simd\jsimdcfg.inc

LOCAL_MODULE := libjpeg
LOCAL_MODULE_FILENAME:=libjpeg

LOCAL_STATIC_LIBRARIES += cpufeatures

include $(BUILD_STATIC_LIBRARY)

Для любого, кто пытался создать официальную версию репо, я успешно использовал прикрепленный здесь патч: libjpeg-turbo кросс-компиляция на Android не удалась.

Затем, в зависимости от того, компилируете ли вы для 32-битной или 64-битной версии:

export CFLAGS="-DSIZEOF_SIZE_T=4"

или же

export CFLAGS="-DSIZEOF_SIZE_T=4"

И запустите cmake с -DWITH_SIMD = FALSE -DCMAKE_TOOLCHAIN_FILE =your_toolchain_file.

Конечно, я знаю, что отключение SIMD не идеально, но, по крайней мере, мне удалось получить сборку, которую я могу начать использовать. Надеемся, что поддержка NEON SIMD в buildsystem будет исправлена ​​в будущем. Использование./configure также не смогло построить правильную SIMD для ARM.

Между прочим, я бы хотел, чтобы люди внесли исправления в основной репо, а не просто развалили его. Прошло 2 года с момента последнего изменения репо, указанного в ответе Алекса Кона.

Другие вопросы по тегам