Libjpeg-turbo для Android
Мне нужно libjpeg-turbo для android ndk. Кто-нибудь сумел скомпилировать его как .a(static) lib?
Я пробовал несколько раз, но он дал мне много ошибок.
Ответы
Ответ 1
Установить 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
Profit!
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
UPDATE: чтобы он работал с Android NDK r15 и более поздними версиями, удалите все ссылки на libcutils
из Android.mk.
Ответ 2
Этот ответ расширяется на ответ Алекса Кон. Полный кредит для него за то, что он начал меня. Этот ответ позволит вам построить libjpeg-turbo со сборкой для ARM (с или без NEON), а также с x86. Совместимость также предусмотрена для MIPS, чтобы вы могли стать хорошим гражданином и создать свое приложение для всех платформ, поддерживаемых версией Android NDK версии r8e.
Я по-прежнему относительный новичок, чтобы отвечать на вопросы, поэтому у меня нет прав на включение вложений. Поэтому мне нужно будет добавить кучу кода. Я также уверен, что есть более эффективные способы сделать биты и куски ниже, так что я открыт для предложений по улучшению.
Чтобы все это работало, было выполнено шесть основных шагов (шаг два имеет множество подэтапов, каждый из которых можно найти после шести основных шагов):
-
Загрузите через git библиотеку libjpeg-turbo, содержащую набор кодов и файлов .mk для Android. Я загрузил его здесь с помощью git:
git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android
Полный кредит и благодарность должны быть предоставлены Тому Галлу за выполнение первоначальной работы.
-
Загрузите YASM (ассемблер для x86) и настройте среду сборки Android для ее поддержки. См. Набор инструкций по настройке YASM для Android NDK, которые я включаю ниже горизонтального правила в конце моих изменений Android.mk на шаге 6. Поддержка x86 требует, чтобы вы не стеснялись настраивать установку NDK.
Возможно, я мог использовать компилятор NASM, но был достаточно далеко по пути YASM, прежде чем исследовать NASM, что я довел путь YASM до завершения.
-
Создайте файл 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_, и дублировать каждый из этих% без WITH_pp_protection_. Например, %define _cpp_protection_RGB_RED 0
стал %define RGB_RED 0
-
Для 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().
-
Включение MIPS.
Чтобы быть хорошим гражданином, я хотел включить компиляцию в MIPS. Хотя для MIPS не существует кода ассемблера, код должен, по крайней мере, компилироваться и запускаться. Для этого я скопировал simd/jsimd_arm.c в simd/jsimd_mips.c. Я отредактировал файл так, чтобы init_simd()
set simd_support = 0;
я также изменил все методы jsimd_can_*()
, чтобы вернуть 0. Наконец, я удалил реализацию из всех других методов.
-
Поскольку меня интересовало больше, чем просто сборка для 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 не поддерживает его.
Чтобы получить поддержку asasm, работающую с NDK, я следовал грубой схеме, представленной здесь: http://software.intel.com/en-us/articles/using-yasm-compiler-on-android-ndkbuild
Вот набор более подробных инструкций. Внутри android-ndk-r8\build\core должны произойти следующие вещи:
-
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))))
-
definitions.mk:
Создайте новый компилятор-asm-source, чтобы он соответствовал новой записи, которую мы добавили в новый цикл for выше. Мы также должны добавить новое определение в файл make. Я добавил следующее. Это комбинация и упрощение различных правил, используемых для создания файлов .c. Нам нужен другой набор опций при использовании ясности, требующих этих изменений.
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. Новый компилятор-asm-источник может идти прямо ниже этого.
Затем найдите строку, начинающуюся с "get-object-name". Я нашел его на линии 1270. Добавьте ".asm" во внутренний цикл for. Поместите его вместе с .c,.s и .S
-
import-locals.mk:
Добавьте строку ниже LOCAL_CFLAGS и LOCAL_CPPFLAGS
LOCAL_YASMFLAGS := $(LOCAL_CFLAGS) $(strip $(LOCAL_YASMFLAGS))
-
default-build-commands.mk:
Добавьте следующую строку в файл. Я поместил мой под раздел TARGET_CXX и над разделом TARGET_LD.
TARGET_ASM = $(TOOLCHAIN_PREFIX)yasm
-
Загрузите и скопируйте файл yasm.exe в папки сборки:
Загрузите копию YASM отсюда: http://yasm.tortall.net/
У меня есть версия N64 для Win64, поэтому загрузилась версия YASM для Win64. Если у вас есть версия N32 для Win32, загрузите версию YASM Win32.
Вы должны просто получить .exe. Скопируйте его в следующие каталоги как yasm.exe. Если у вас есть другие версии toolchain, скопируйте их в эти каталоги:
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. И, как указано выше, если у вас есть какие-либо другие версии toolchain, скопируйте их в эти каталоги:
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
Ответ 3
Спасибо Алекс Кон и ответил Дек за долю;
Этот ответ расширяется на ответ Алекса Кон и отвечает на ответ Дек,
Я использую jpeg turbo 1.3.9, ndk-r9d, о yasm.exe, содержится ndk-r9d, после ответа на третий шаг, у меня была одна ошибка в строке simd/jsimdext.inc: 182 "% define EXTN (name) _% + name; foo() → _foo"; измените его на "% define 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)
Ответ 4
Для тех, кто пытается создать официальную версию репо, мне удалось использовать прилагаемый патч: libjpeg-turbo cross-compile to Android не работает.
Затем, в зависимости от того, компилируете ли вы для 32-разрядной или 64-разрядной версии:
export CFLAGS="-DSIZEOF_SIZE_T=4"
или
export CFLAGS="-DSIZEOF_SIZE_T=4"
И запустите cmake с -DWITH_SIMD = FALSE -DCMAKE_TOOLCHAIN_FILE = ваш_toolchain_file.
Конечно, я знаю, что отключение SIMD не идеально, но по крайней мере мне удалось получить сборку, которую я могу начать использовать. Хотелось бы надеяться, что поддержка архитектуры neon SIMD в будущем будет исправлена. Использование. /configure также не смогло создать правильный SIMD для ARM.
Кстати, я бы хотел, чтобы люди внесли исправления в основное репо, а не просто разветвляли его. Прошло 2 года с момента последнего изменения репо, указанного в ответе alex-cohn.