2012-09-25 97 views
4

我有問題。構建OpenJPEG for Android

我該怎麼辦我在Android上使用OpenJPEG? (我是「j2k_to_image」主要是想用)。

我想你告訴我怎麼寫一個makefile。 在此先感謝。

回答

3

我能夠使用以下大綱構建+使用OpenJPEG將JPEG2000圖像加載到我的應用程序中。你必須根據你的環境和你想如何使用它來定製它。我的回答提供了粗略的指導方針,以及我遇到的主要障礙(我的Android.mk和Application.mk文件應該是什麼,以及如何處理OpenJPEG庫需要cmake)的具體答案。

由於我們在談論OpenJPEG,因此這個答案假定您熟悉並計劃爲您的應用使用Android NDK。它還假定您正在使用Android IDE的Eclipse版本。答案還假定您熟悉靜態庫如何與Android NDK一起工作以及如何將它們引用到您的主應用程序中。您可以在下面擴展我的答案以創建共享庫或將代碼直接包含到您的應用程序中。如果你不熟悉這些先決條件,stackoverflow和谷歌可以提供幫助。

我使用Android NDK r8e和OpenJPEG 2.0.0獲得成功。

步驟:

  1. 下載,然後從http://www.openjpeg.org/index.php?menu=download
  2. 擴大OpenJPEG 2.0.0在Eclipse中創建一個本地項目。我創建了一個項目,允許我使用OpenJPEG作爲靜態庫
  3. 在我的項目的jni文件夾中,我對Application.mk和我的Android.mk文件使用了以下內容。見下文。
  4. 創建一個自定義opj_config.h。 OpenJPEG是用cmake編譯的。我不想處理它,原因有很多 - 我的其他內容都不依賴於它(所以它會增加另一層複雜性),我在Windows上(它沒有內置,而這stackoverflow post引用android-cmake,android-cmake的文檔表明它可能無法在Windows上運行)。請參閱下面的我的opj_config.h。它應該適合你。確保你把它放在包含路徑的某個地方。
  5. 構建一個Android NDK靜態庫項目
  6. 參考您的靜態庫到您的主項目

就這樣,我就能夠JPEG2000圖像成功加載到我基於NDK,Android應用程序。

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 @[email protected] 
//#cmakedefine HAVE_PNG_H @[email protected] 
//#cmakedefine HAVE_LIBTIFF @[email protected] 
//#cmakedefine HAVE_TIFF_H @[email protected] 

#define HAVE_SSIZE_T 1 

//#cmakedefine _LARGEFILE_SOURCE 
//#cmakedefine _LARGE_FILES 
//#cmakedefine _FILE_OFFSET_BITS @[email protected] 

#define HAVE_FSEEKO 1 

//#cmakedefine HAVE_LIBLCMS1 
//#cmakedefine HAVE_LIBLCMS2 
//#cmakedefine HAVE_LCMS1_H 
//#cmakedefine HAVE_LCMS2_H 

#endif // OPJ_CONFIG_H