18

Android ndkにはlibjpeg-turboが必要です。.a (静的) lib としてコンパイルできた人はいますか? 何度か試しましたが、多くのエラーしか表示されませんでした。

4

4 に答える 4

33

Android 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 以降で動作させるには、 Android.mklibcutilsからすべての参照を削除します。

于 2012-09-06T08:51:37.173 に答える
8

この回答は、Alex Cohn の回答を拡張したものです。私を始めさせてくれた彼に完全な功績があります。この回答により、ARM(NEONの有無にかかわらず)およびx86のアセンブリを使用して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
    

    最初の作業を行ってくれた Tom Gall に完全な功績と感謝を捧げる必要があります。

  2. YASM (x86 用のアセンブラー) をダウンロードし、それをサポートするように Android ビルド環境を構成します。ステップ 6 の Android.mk の変更の最後にある水平ルールの下に含まれている、Android NDK 用の YASM の構成に関する一連の手順を参照してください。

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

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

    APP_ABI := all
    APP_OPTIM := release
    

    APP_OPTIM は、android-ndk を使用してネイティブ コードを最適化する方法 (速度の最適化) に由来します。

    Android.mk 内で、「cjpeg」コメント ブロック以下のすべてをコメント アウトしました。ブロック コメントを行うには、How to add multi-line comments in makefilesのアドバイスに従いました。

    次に、現在サポートされているすべての CPU (ARM、x86、MIPS) 用にビルドできるように、Android.mk ファイル自体をカスタマイズしました。これが私が最終的に得たものです(静的ライブラリが必要だったため、一部のコードはコメントアウトされていました-元のコードをそのままにして、何が変更されたかを確認できるようにしました)。以下のファイルは私のビルド環境用にカスタマイズされているため、おそらく 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 はそれをサポートしていません。

NDK で動作する .asm サポートを取得するために、ここに示されている大まかな概要に従いました: http://software.intel.com/en-us/articles/using-yasm-compiler-on-android-ndkbuild

より詳細な手順のセットを次に示します。android-ndk-r8\build\core 内で、次のことを行う必要があります。

  1. ビルドバイナリ.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))))
    
  2. 定義.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. インポート-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/

    私は NDK の Win64 バージョンを持っているので、YASM の Win64 バージョンをダウンロードしました。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
    
于 2013-12-20T06:40:55.927 に答える
2

Alex Cohn に感謝し、Dec に回答して共有してもらいました。

この回答は、Alex Cohn の回答と回答された Dec の回答を拡張したものです。

私は jpeg ターボ 1.3.9、ndk-r9d を使用しています。yasm.exe については、ndk-r9d が含まれています。 EXTN(名前) _ %+ 名前 ; 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)
于 2014-12-01T08:22:17.790 に答える
0

公式リポジトリ バージョンをビルドしようとしている人のために、ここに添付されているパッチを使用して成功しました: libjpeg-turbo cross-compile to Android fails

次に、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 をビルドできませんでした。

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

于 2016-02-21T06:01:41.573 に答える