我需要用于 android ndk的 libjpeg-turbo 。有没有人设法将它编译为.a(静态)库?我已经尝试了几次,但它只给了我很多错误。
4 回答
安装安卓 NDK。以下说明已使用r8b验证,旧版本可能有问题,我不知道。
从 Benjamin Gaignard 处获取libjpeg-turbo的 Android 源代码:
git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android
在git创建的libjpeg-turbo目录中,编辑文件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的所有引用。
这个答案扩展了 Alex Cohn 的答案。完全归功于他让我开始。这个答案将允许您使用 ARM(带或不带 NEON)以及 x86 的程序集构建 libjpeg-turbo。还为 MIPS 提供了兼容性,这样您就可以成为一个好公民,并为 Android NDK 的 r8e 版本支持的所有平台构建您的应用程序。
对于实际回答问题,我仍然是一个相对新手,所以没有包含附件的权限。所以我将不得不内联一堆代码。我也确信有更好的方法来做下面的点点滴滴,所以我愿意接受改进的建议。
让这一切工作通过六个主要步骤完成(第二步有许多子步骤——每个子步骤都可以在主要的六个步骤之后找到):
通过 git 下载 libjpeg-turbo 库,其中包含一组适用于 Android 的代码和 .mk 文件。我用 git 从这里下载了它:
git clone git://git.linaro.org/people/tomgall/libjpeg-turbo/libjpeg-turbo.git -b linaro-android
必须对 Tom Gall 进行初始工作给予充分的信任和感谢。
下载 YASM(x86 的汇编程序)并配置 Android 构建环境以支持它。请参阅关于为 Android NDK 配置 YASM 的说明集,我在步骤 6 中我的 Android.mk 更改末尾的水平规则下方包含了这些说明。支持 x86 要求您不要羞于调整 NDK 安装。
我也许可以使用 NASM 编译器,但在调查 NASM 之前,我已经完成了 YASM 路径。
创建 simd/jsmidcfg.inc 文件。libjpeg-turbo 库提供 simd/jsmidcfg.inc.h。它旨在让预处理器获取 .h 并将其转换为 .inc。我确信有比我所做的更好的方法来实现它。但由于时间紧迫,未能整理好。相反,我使用以下命令手动运行 Android 附带的 gcc 来创建文件:
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_ 开头的每个 %defines,并在没有 _cpp_protection_ 的情况下复制每个 %defines。例如,
%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()
设置simd_support = 0;
我还将所有jsimd_can_*()
方法更改为返回 0。最后,我从所有其他方法中删除了实现。因为我不仅仅对 ARM 的构建感兴趣,所以我更改了 Application.mk 文件以包含以下行:
APP_ABI := all APP_OPTIM := release
APP_OPTIM 来自How to optimize a native code with android-ndk (Speed Optimization)
在 Android.mk 中,我注释掉了“cjpeg”注释块及下方的所有内容。要进行块注释,我遵循了如何在 makefiles 中添加多行注释的建议
接下来我自定义了 Android.mk 文件本身,以便我可以为所有当前支持的 CPU(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 中,需要发生以下事情:
构建二进制.mk:
all_source_extensions := .c .s .S $(LOCAL_CPP_EXTENSION)
=>all_source_extensions := .c .s .asm .S $(LOCAL_CPP_EXTENSION)
对我来说,上面是第 228 行。
在以“# Build the sources to object files”开头的行之后,您将看到几个 foreach 循环。像这样添加一个(我在第 272 行添加了它):
$(foreach src,$(filter %.asm,$(LOCAL_SRC_FILES)), $(call compile-asm-source,$(src),$(call get-object-name,$(src))))
定义.mk:
创建一个新的 compile-asm-source 以匹配我们在上面的新 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 放在一起
进口-locals.mk:
在 LOCAL_CFLAGS 和 LOCAL_CPPFLAGS行下方添加以下行
LOCAL_YASMFLAGS := $(LOCAL_CFLAGS) $(strip $(LOCAL_YASMFLAGS))
默认构建命令.mk:
在文件中的任意位置添加以下行。我把我的放在 TARGET_CXX 部分下面和 TARGET_LD 部分上面。
TARGET_ASM = $(TOOLCHAIN_PREFIX)yasm
下载 yasm.exe 并将其复制到构建文件夹:
从这里下载 YASM 的副本:http: //yasm.tortall.net/
我有Win64版的NDK,所以下载了Win64版的YASM。如果您有 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
感谢 Alex Cohn 并回答了 Dec 的分享;
这个答案扩展了亚历克斯科恩的答案并回答了十二月的答案;
我正在使用 jpeg turbo 1.3.9,ndk-r9d,关于 yasm.exe,包含 ndk-r9d,在回答了 Dec 的第 3 步后,我在 simd/jsimdext.inc 行中有一个错误:182 "%define EXTN(name) _ %+ name ; foo() -> _foo"; 将其更改为“%define EXTN(name) name”;然后好的,这个问题已经解决了;
这是我的 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)
对于任何尝试构建官方 repo 版本的人,我使用此处附带的补丁成功:libjpeg-turbo cross-compile to Android failed。
然后,根据您是为 32 位还是 64 位编译:
export CFLAGS="-DSIZEOF_SIZE_T=4"
或者
export CFLAGS="-DSIZEOF_SIZE_T=4"
并使用 -DWITH_SIMD=FALSE -DCMAKE_TOOLCHAIN_FILE= your_toolchain_file运行 cmake 。
当然,我知道禁用 SIMD 并不理想,但至少我设法获得了可以开始使用的构建。希望构建系统的 NEON SIMD 支持在未来得到修复。使用 ./configure 也无法为 ARM 构建正确的 SIMD。
顺便说一句,我希望人们能为主要的 repo 提供修复,而不是简单地分叉它。自 alex-cohn 的回答中引用的回购协议的最后一次更改已经过去了 2 年。