web-dev-qa-db-fra.com

libjpeg-turbo pour Android

J'ai besoin de libjpeg-turbo pour Android ndk. Quelqu'un at-il réussi à le compiler en tant que .a (statique) lib? J'ai essayé plusieurs fois, mais cela ne m'a donné que beaucoup d'erreurs.

16
KoVadim

Installez Android NDK . Les instructions suivantes ont été vérifiées avec r8b , les anciennes versions peuvent avoir des problèmes, je ne sais pas.

Obtenir les sources Android pour libjpeg-turbo de Benjamin Gaignard:

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

Dans le répertoire libjpeg-turbo créé par git , modifiez le fichier Android.mk : après la ligne 70, LOCAL_MODULE := libjpeg, ajoutez ce qui suit:

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

Exécuter ndk-build :

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

Profit!

PS: vous voudrez peut-être le armeabi-v7a version:

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

Ou compilez pourARM, pour améliorer les performances, ajoutez à la ligne de commande:

LOCAL_ARM_MODE=arm

Si votre cible aNEONsupport, ajoutez à la ligne de commande:

LOCAL_ARM_NEON=true Arch_ARM_HAVE_NEON=true

UPDATE: pour que cela fonctionne avec Android NDK r15 et les versions ultérieures, supprimez toutes les références à libcutils de Android.mk .

31
Alex Cohn

Cette réponse développe la réponse d'Alex Cohn. Tout le mérite lui revient de m'avoir lancé. Cette réponse vous permettra de construire libjpeg-turbo avec Assembly pour ARM (avec ou sans NEON) ainsi que x86. La compatibilité est également fournie pour MIPS afin que vous puissiez être un bon citoyen et construire votre application pour toutes les plateformes prises en charge par la version r8e du NDK Android.

Je suis toujours un débutant relatif à réellement répondre à des questions, afin de ne pas avoir l'autorisation d'inclure des pièces jointes. Donc, je vais devoir intégrer un tas de code. Je suis également convaincu qu'il existe de meilleures façons de procéder, en particulier, et je suis donc ouvert aux suggestions d'amélioration.

Tout cela a été fait en six étapes principales (la deuxième étape comporte de nombreuses sous-étapes, chacune pouvant être trouvée après les six étapes principales):

  1. Téléchargez via git la bibliothèque libjpeg-turbo contenant un ensemble de codes et de fichiers .mk pour Android. Je l'ai téléchargé à partir d'ici avec git:

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

    Nous devons remercier Tom Gall d’avoir effectué le travail initial.

  2. Téléchargez YASM (un assembleur pour x86) et configurez l'environnement de construction Android pour le prendre en charge. Consultez l'ensemble des instructions relatives à la configuration de YASM pour le NDK Android que j'inclus sous la règle horizontale à la fin des modifications apportées à Android.mk à l'étape 6. La prise en charge de x86 nécessite de ne pas hésiter à peaufiner l'installation de NDK.

    J'aurais peut-être pu utiliser le compilateur NASM, mais j'étais assez loin sur le chemin YASM avant d'enquêter sur le modèle NASM pour indiquer que j'avais achevé le chemin YASM.

  3. Créez le fichier simd/jsmidcfg.inc. La bibliothèque libjpeg-turbo fournit simd/jsmidcfg.inc.h. Le pré-processeur doit convertir le fichier .h en fichier .inc. Je suis sûr qu'il existe un meilleur moyen pour que cela se produise que ce que j'ai fait. Mais nous n'avons pas pu le résoudre en raison des contraintes de temps. Au lieu de cela, j'ai exécuté manuellement l'un des gcc fournis avec Android pour créer le fichier à l'aide de la commande suivante:

    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
    

    Une fois le pré-processeur terminé, je devais éditer à la main le fichier pour le rendre utilisable. Je devais sélectionner toutes les lignes ci-dessus "; - jpeglib.h" et les supprimer.

    Ensuite, je devais trouver chacune des% définitions ayant commencé avec _cpp_protection_ et dupliquer chacune de ces% définit SANS la _cpp_protection_. Par exemple, %define _cpp_protection_RGB_RED 0 est devenu %define RGB_RED 0

  4. Pour ARM, je voulais que mon code prenne en charge de manière dynamique les instructions NEON sur le matériel qui l’avait et, pour revenir à quelque chose de plus simple, ne modifiant pas le matériel, j’ai modifié simd/jsimd_arm.c pour interroger dynamiquement les informations. Je ne voulais pas avoir à faire ce choix lors de la construction de libjpeg-turbo.

    J'ai ajouté les lignes de code suivantes:

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

    et

    #ifdef Android
      uint64_t cpuFeatures = Android_getCpuFeatures();
      if (cpuFeatures & Android_CPU_ARM_FEATURE_NEON) {
         simd_support |= JSIMD_ARM_NEON;
      }
    #endif
    

    dans la méthode init_simd ().

  5. Activer MIPS.

    Pour être un bon citoyen, je voulais activer la compilation sur MIPS. Bien qu'il n'y ait pas de code assembleur pour MIPS, le code doit au moins être compilé et exécuté. Pour ce faire, j'ai copié simd/jsimd_arm.c dans simd/jsimd_mips.c. J'ai modifié le fichier de sorte que init_simd() set simd_support = 0; J'ai également modifié toutes les méthodes jsimd_can_*() pour renvoyer 0. Enfin, j'ai supprimé l'implémentation de toutes les autres méthodes.

  6. Parce que je souhaitais plus que la construction d'ARM, j'ai modifié le fichier Application.mk afin d'inclure les lignes suivantes:

    APP_ABI := all
    APP_OPTIM := release
    

    L'APP_OPTIM vient de Comment optimiser un code natif avec Android-ndk (Speed ​​Optimization)

    Dans Android.mk, j'ai commenté tout du bloc de commentaires "cjpeg" et ci-dessous. Pour faire un bloc de commentaires, j'ai suivi les conseils de Comment ajouter des commentaires multi-lignes dans les makefiles

    J'ai ensuite personnalisé le fichier Android.mk afin de pouvoir le construire pour tous les processeurs actuellement pris en charge (ARM, x86, MIPS). Voici ce que je me suis retrouvé avec (certains codes commentés parce que je voulais une bibliothèque statique - également pour laisser le code original en place afin que je puisse voir ce qui a changé). Vous devrez probablement modifier (ou supprimer) les appels à la méthode addprefix car le fichier ci-dessous est personnalisé pour mon environnement de construction. Mais à part ça, ça devrait marcher pour vous.

.

##################################################
###                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)

Une partie du code source fourni avec libjpeg-turbo est au format .asm. C'est-à-dire qu'il doit être compilé avec l'assembleur NASM. À la livraison, le NDK Android n’est pas pris en charge.

Pour que le support .asm fonctionne avec NDK, j’ai suivi l’esquisse générale présentée ici: http://software.intel.com/en-us/articles/using-yasm-compiler-on-Android-ndkbuild

Voici un ensemble d'instructions plus détaillées. Dans Android-ndk-r8\build\core, les éléments suivants doivent se produire:

  1. build-binary.mk:

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

    Pour moi, ce qui précède était sur la ligne 228.

    Après la ligne qui commence par: "# Construisez les sources en fichiers objets", vous verrez plusieurs boucles foreach. Ajoutez-en un comme ceci (je l'ai ajouté à la ligne 272):

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

    Créez un nouveau compile-asm-source pour correspondre à la nouvelle entrée que nous avons ajoutée à la nouvelle boucle for ci-dessus. Nous devons également ajouter une nouvelle définition dans le fichier make. J'ai ajouté le suivant. C'est une combinaison et une simplification des différentes règles utilisées pour créer des fichiers .c. Lors de l’utilisation de yasm, nous avons besoin d’un ensemble d’options différent qui nécessite ces modifications.

    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))
    

    Recherchez la ligne commençant par 'compile-s-source'. Je l'ai trouvé à la ligne 1491. Le nouveau compile-asm-source peut aller juste en dessous.

    Ensuite, recherchez la ligne commençant par "get-object-name". Je l'ai trouvé à la ligne 1270. Ajoutez ".asm" à la boucle for interne. Associez-le aux fichiers .c, .s et .S

  3. import-locals.mk:

    Ajoutez la ligne suivante ci-dessous les lignes LOCAL_CFLAGS et LOCAL_CPPFLAGS

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

    Ajoutez la ligne suivante n'importe où dans le fichier. J'ai mis le mien sous la section TARGET_CXX et au-dessus de la section TARGET_LD.

    TARGET_ASM       = $(TOOLCHAIN_PREFIX)yasm
    
  5. Téléchargez et copiez yasm.exe dans les dossiers de construction:

    Téléchargez une copie de YASM à partir d’ici: http://yasm.tortall.net/

    J'ai la version Win64 du NDK, j'ai donc téléchargé la version Win64 de YASM. Si vous disposez de la version Win32 du NDS, téléchargez la version Win32 de YASM.

    Vous devriez juste obtenir le fichier .exe. Copiez-le dans les répertoires suivants en tant que yasm.exe. Si vous avez d'autres versions de la chaîne d'outils, copiez-la également dans ces répertoires:

    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
    

    Ensuite, copiez à nouveau le fichier dans les répertoires ci-dessous sous le nom i686-linux-Android-yasm.exe. Et comme ci-dessus, si vous avez d'autres versions de la chaîne d'outils, copiez-la également dans ces répertoires:

    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
    
8
markmanca

Merci Alex Cohn et a répondu décembre pour le partage;

Cette réponse développe la réponse d'Alex Cohn et répond à la réponse de Dec;

J'utilise jpeg turbo 1.3.9, ndk-r9d, à propos de yasm.exe, le ndk-r9d est contenu, après avoir répondu à l'étape 3 de Dec, j'ai eu une erreur dans simd/jsimdext.inc line: 182 "% define EXTN (nom) _% + nom; toto () -> _ toto "; remplacez-le par "% define EXTN (name) name"; alors ok, ce problème avait résolu;

c'est mon 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)
1
Mr. Xian

Pour tous ceux qui essaient de construire la version officielle du référentiel, le succès est fourni avec le correctif joint ici: La compilation croisée entre libjpeg-turbo et Android échoue .

Ensuite, selon que vous compilez pour 32 bits ou 64 bits:

export CFLAGS="-DSIZEOF_SIZE_T=4"

ou

export CFLAGS="-DSIZEOF_SIZE_T=4"

Et lancez cmake avec -DWITH_SIMD = FALSE -DCMAKE_TOOLCHAIN_FILE = your_toolchain_file .

Bien sûr, je suis conscient que désactiver SIMD n’est pas idéal, mais au moins j’ai réussi à obtenir une version que je peux commencer à utiliser. Espérons que le support de NEON SIMD du système de construction sera corrigé à l'avenir. L’utilisation de ./configure n’a pas non plus permis de créer le SIMD correct pour ARM.

Incidemment, je souhaite que les gens apportent des corrections au référentiel principal, plutôt que de simplement le fourrer. Cela fait 2 ans que le dernier changement de référent cité dans la réponse d’Alex-Cohn.

0
Droid Coder