web-dev-qa-db-ja.com

libjpeg-turbo for android

必要です libjpeg-turbo for Android ndk。誰かがそれを.a(静的)libとしてコンパイルできましたか?何度か試しましたが、それは私に与えました多くのエラーのみ。

16
KoVadim

インストールAndroid NDK 。次の手順はr8bで確認されましたが、古いバージョンでは問題が発生する可能性があります、 知りません。

ベンジャミン・ガイナードからAndroid libjpeg-turbo のソースを入手してください:

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

[〜#〜] update [〜#〜]:Android NDK r15以降で動作させるには、 libcutilsへのすべての参照をAndroid.mkから削除します。

31
Alex Cohn

この答えは、AlexCohnの答えを拡張したものです。私が始めたのは彼の功績です。この回答により、x86だけでなくARM(NEONありまたはなし)のアセンブリを使用してlibjpeg-turboをビルドできます。MIPSにも互換性が提供されているため、良き市民になってビルドできます。 Android NDKがサポートするr8eバージョンのすべてのプラットフォーム用のアプリ。

私はまだ実際に質問に答えるのは比較的初心者なので、添付ファイルを含める権限がありません。したがって、一連のコードをインライン化する必要があります。また、以下の断片を実行するためのより良い方法があると確信しているので、改善のための提案を受け入れます。

これをすべて機能させるには、6つの主要なステップで行いました(ステップ2には多くのサブステップがあります。各サブステップは主要な6つのステップの後にあります)。

  1. Android用のコードと.mkファイルのセットを含むlibjpeg-turboライブラリをgit経由でダウンロードします。ここからgitでダウンロードしました:

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

    最初の仕事をしてくれたTomGallに完全な信用と感謝を捧げなければなりません。

  2. YASM(x86のアセンブラー)をダウンロードし、それをサポートするようにAndroidビルド環境を構成します。Android NDK that I)のYASMを構成するための一連の手順を参照してください。手順6のAndroid.mkの変更の最後に、水平方向のルールの下に含めています。x86をサポートするには、NDKのインストールを微調整することを躊躇しないでください。

    NASMコンパイラを使用することもできたかもしれませんが、NASMを調査する前に、YASMパスを十分に下って、YASMパスを完成させました。

  3. 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_で始まる各%defineを見つけて、_cpp_protection_なしでそれらの各%defineを複製する必要がありました。たとえば、_%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() set _simd_support = 0;_になるようにファイルを編集しました。また、すべてのjsimd_can_*()メソッドを変更して0を返しました。最後に、他のすべてのメソッドから実装を削除しました。

  6. ARMのビルド以上のものに興味があったので、Application.mkファイルを変更して次の行を含めました。

    _APP_ABI := all
    APP_OPTIM := release
    _

    APP_OPTIMは Androidでネイティブコードを最適化する方法-ndk(速度最適化)

    Android.mk内で、「cjpeg」コメントブロック以下からすべてをコメントアウトしました。ブロックコメントを行うために、私は makefileに複数行コメントを追加する方法 のアドバイスに従いました

    次に、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内で、次のことが発生する必要があります。

  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. defined.mk:

    上記の新しいforループ内に追加した新しいエントリに一致する新しいcompile-asm-sourceを作成します。また、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行目で見つかりました。内側のforループに「.asm」を追加します。 .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/

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

Alex Cohnに感謝し、12月にシェアを求めて答えました。

この回答は、AlexCohnの回答とDecの回答を拡張したものです。

私はjpegturbo 1.3.9、ndk-r9dを使用しています。yasm.exeについては、ndk-r9dが含まれています。12月のステップ3に回答した後、simd/jsimdext.inc line:182 "%defineに1つのエラーがありました。 EXTN(name)_%+ name; foo()-> _foo "; 「%defineEXTN(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)
1
Mr. Xian

公式のリポジトリバージョンを作成しようとしている人は、ここに添付されているパッチを使用して成功しました: 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を無効にすることは理想的ではないことは承知していますが、少なくとも、使い始めることができるビルドを取得することができました。うまくいけば、ビルドシステムのNEONSIMDサポートは将来修正されるでしょう。 ./configureを使用しても、ARM用の正しいSIMDを構築できませんでした。

ちなみに、メインリポジトリを単にフォークするのではなく、修正を提供してほしいと思います。 alex-cohnの回答で引用されたレポへの最後の変更から2年が経ちました。

0
Droid Coder