构建OpenJPEG for Android

时间:2012-09-25 02:39:50

标签: android makefile jpeg jpeg2000

我有一个问题。

我该怎么办?我在Android上使用OpenJPEG? (我是“j2k_to_image”主要是想使用。)

我想告诉我如何编写makefile。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

我能够使用以下大纲构建+使用OpenJPEG将JPEG2000图像加载到我的应用程序中。您必须根据您的环境以及如何使用它来自定义它。我的回答提供了粗略的指导以及我遇到的主要绊脚石的具体答案(我的Android.mk和Application.mk文件应该是什么,以及如何处理OpenJPEG库需要cmake的事实)。

由于我们正在谈论OpenJPEG,这个答案假设您熟悉并计划为您的应用使用Android NDK。它还假设您使用的是Android IDE的Eclipse版本。答案还假设您熟悉静态库如何与Android NDK配合使用以及如何将它们引用到主应用程序中。您可以在下面扩展我的答案,以创建共享库或将代码直接包含到您的应用程序中。如果您不熟悉这些先决条件,stackoverflow和Google可以提供帮助。

我在Android NDK r8e和OpenJPEG 2.0.0上取得了成功。

步骤:

  1. http://www.openjpeg.org/index.php?menu=download
  2. 下载并扩展OpenJPEG 2.0.0
  3. 在Eclipse中创建本机项目。我创建了一个允许我将OpenJPEG用作静态库的项目
  4. 在我的项目的jni文件夹中,我将以下内容用于我的Application.mk和我的Android.mk文件。见下文。
  5. 创建自定义opj_config.h。 OpenJPEG旨在用cmake编译。我出于多种原因不想处理它 - 我的其他任何内容都没有依赖它(所以它会增加另一层复杂性),我在Windows上(它没有内置的) ,以及这个stackoverflow post引用android-cmake,android-cmake的文档表明它可能无法在Windows上运行)。请参阅下面的opj_config.h。它应该适合你。确保将其放在包含路径中的某个位置。
  6. 构建Android NDK静态库项目
  7. 将静态库引用到主项目中
  8. 通过这种方式,我能够成功将JPEG2000图像加载到基于Android NDK的应用程序中。

    Application.mk:

    APP_ABI := all
    APP_PLATFORM := android-9
    APP_MODULES := openjpeg
    

    Android.mk(您必须自定义以下所有路径):

    # Taken from https://stackoverflow.com/questions/4036191/sources-from-subdirectories-in-makefile
    # The trailing slash is required.
    
    rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
    
    ALL_CPPS := $(call rwildcard,../../openjpeg-2.0.0/src/lib/openjp2,*.c)
    ALL_CPPS += $(call rwildcard,../../openjpeg-2.0.0/src/lib/openjpip,*.c)
    
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := openjpeg
    LOCAL_C_INCLUDES := /path/to/openjpeg-2.0.0/src/lib/openjp2
    LOCAL_SRC_FILES := $(addprefix ../,$(ALL_CPPS))
    
    LOCAL_CFLAGS   = -DUSE_JPIP
    
    include $(BUILD_STATIC_LIBRARY)
    

    opj_config.h(通常cmake为你正在构建的平台创建这个 - 但正如我上面提到的,我不想处理cmake,所以我手工创建了这个文件):

    #ifndef OPJ_CONFIG_H
    #define OPJ_CONFIG_H
    
    #define OPJ_PACKAGE_VERSION "2.0.0"
    
    #define HAVE_INTTYPES_H 1
    #define HAVE_MEMORY_H 1
    #define HAVE_STDINT_H 1
    
    #ifndef HAVE_STDLIB_H  // I had a conflict with this somewhere else in my project -- good form dictates that I should probably ifndef guard the other defines in this file as well....that is a TODO for later
    #define HAVE_STDLIB_H 1
    #endif
    
    #define HAVE_STRINGS_H 1
    #define HAVE_STRING_H 1
    #define HAVE_SYS_STAT_H 1
    #define HAVE_SYS_TYPES_H 1
    #define HAVE_UNISTD_H 1
    
    // I'm not utilizing libpng or libtiff, so don't set these
    //#cmakedefine HAVE_LIBPNG @HAVE_LIBPNG@
    //#cmakedefine HAVE_PNG_H @HAVE_PNG_H@
    //#cmakedefine HAVE_LIBTIFF @HAVE_LIBTIFF@
    //#cmakedefine HAVE_TIFF_H @HAVE_TIFF_H@
    
    #define HAVE_SSIZE_T 1
    
    //#cmakedefine _LARGEFILE_SOURCE
    //#cmakedefine _LARGE_FILES
    //#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@
    
    #define HAVE_FSEEKO 1
    
    //#cmakedefine HAVE_LIBLCMS1
    //#cmakedefine HAVE_LIBLCMS2
    //#cmakedefine HAVE_LCMS1_H
    //#cmakedefine HAVE_LCMS2_H
    
    #endif // OPJ_CONFIG_H