libjpeg-turbo for android

我需要libjpeg-turbo for android ndk。 有没有人设法将其编译为.a(静态)库? 我已经尝试了几次,但是只给了我很多错误。

Solutions Collecting From Web of "libjpeg-turbo for android"

安装Android NDK 。 下面的说明用r8bvalidation,旧版本可能有问题,我不知道。

从Benjamin Gaignard获取libjpeg-turbo的Android源代码:

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

在由git创build的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及更高版本一起使用, libcutilsAndroid.mk中删除对libcutils所有引用。

这个答案扩展了Alex Cohn的答案。 全额贷款给他让我开始。 这个答案将允许你build立libjpeg-turbo与程序集的ARM(有或没有NEON)以及x86。 还为MIPS提供了兼容性,以便您可以成为一名优秀的公民,并为Android NDK的r8e版本支持的所有平台构build您的应用程序。

我还是一个相对的新手来回答问题,所以没有权限包含附件。 所以我将不得不内联一堆代码。 我也相信有更好的办法做下面的点点滴滴,所以我愿意提出改进的build议。

完成这一切的工作是在六个主要步骤中完成的(第二步有许多子步骤 – 每个步骤可以在主要六步之后find):

  1. 通过git下载包含一组Android代码和.mk文件的libjpeg-turbo库。 我用git从这里下载它:

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

    必须给Tom Gall充分的信任和感谢,才能完成最初的工作。

  2. 下载YASM(x86的汇编程序)并configurationAndroid构build环境以支持它。 请参阅关于为Android NDKconfigurationYASM的说明,其中包括在步骤6中Android.mk更改结束时的水平规则下方。支持x86要求您不要害怕调整NDK安装。

    我也许本来可以使用NASM编译器,但是在调查NASM之前,我已经把YASMpath下了足够远的距离,以便完成YASMpath。

  3. 创buildsimd / jsmidcfg.inc文件。 libjpeg-turbo库提供了simd / jsmidcfg.inc.h。 这是为了让预处理器采用.h并将其转换为.inc。 我敢肯定,有一个更好的办法,比我所做的发生。 但由于时间压力,无法把它整理出来。 相反,我手动运行一个随Android附带的gcc,使用以下命令创build文件:

     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 -EC:\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 

    预处理器完成后,我必须手动编辑文件才能进入可用状态。 我不得不select上面的所有行“; – jpeglib.h”并删除它们。

    接下来,我必须find以_cpp_protection_开头的每个%定义,并且在没有_cpp_protection_的情况下复制每个%定义。 例如, %define _cpp_protection_RGB_RED 0变成%define RGB_RED 0

  4. 对于ARM,我希望我的代码在硬件上dynamic地支持NEON指令,并且在没有硬件的硬件上回退,我修改了simd / jsimd_arm.c来dynamic查询信息。 构buildlibjpeg-turbo时,我不想做这个select。

    我添加了以下几行代码:

     #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没有任何汇编代码,但代码至less应该编译并运行。 为此,我将simd / jsimd_arm.c复制到simd / jsimd_mips.c。 我编辑的文件,使init_simd()设置simd_support = 0; 我也改变了所有的jsimd_can_*()方法返回0.最后,我从所有其他方法中删除了实现。

  6. 因为我对ARM的构build感兴趣不止,所以我更改了Application.mk文件以包含以下几行:

     APP_ABI := all APP_OPTIM := release 

    APP_OPTIM来自如何使用android-ndk(速度优化)优化本机代码

    在Android.mk中,我评论了“cjpeg”注释块和下面的所有内容。 要做块评论,我遵循了如何在makefile中添加多行注释的build议

    接下来,我自己定制了Android.mk文件,以便可以构build当前支持的所有CPU(ARM,x86,MIPS)。 这是我最后(一些代码注释掉了,因为我想要一个静态库 – 也离开原来的代码,所以我可以看到什么改变了)。 您很可能不得不更改(或删除)addprefix方法调用,因为下面的文件是为我的构build环境定制的。 但除此之外,它应该为你工作。

 ################################################## ### 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线。

    在以“#将源代码创build为目标文件”开头的行之后,您将看到几个foreach循环。 添加一个这样的(我添加了272行):

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

    创build一个新的compile-asm-source来匹配我们在上面新的for循环中添加的新条目。 我们还必须在make文件中添加一个新的定义。 我添加了以下内容。 它是用于构build.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)) 

    search以“compile-s-source”开头的行。 我发现它在1491行。新的编译源码可以在下面。

    接下来,search以“get-object-name”开头的行。 我在1270行find它。将“.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复制到构build文件夹:

    从这里下载YASM的副本:http: //yasm.tortall.net/

    我有Win64版本的NDK,所以下载了Win64版本的YASM。 如果您有Win32版本的NDS,请下载Win32版本的YASM。

    你应该只是得到.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)回答12月份的问题

这个答案扩展了Alex Cohn的答案,并回答了12月的答案。

我使用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 -ED:\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) 

对于任何人试图build立官方回购版本,我已经成功使用附加的补丁在这里: libjpeg-turbo交叉编译到Android失败 。

然后,根据您是在编译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并不理想,但至less我设法构build了一个可以开始使用的构build。 希望构build系统的NEON SIMD支持将在未来得到修复。 使用./configure也无法为ARM构build正确的SIMD。

顺便说一句,我希望人们会为主要的回购贡献一些修补,而不是简单地分解它。 Alex-cohn的回答中引用了回购的最后一个变化已经有2年了。