Introduction

POCO C++ Libraries Android Platform Notes

Introduction

Starting with release 1.4.2 the POCO C++ Libraries can be used on Android, using the NDK r6. The gmake-based build system (also used for Mac OS X, Linux, etc.) is used to build the libraries. A standalone "customized" toolchain for Android (see below) is required.

Requirements

Standalone Toolchain

Please refer to the Android NDK Dev Guide document "Standalone Toolchain", section 3, (docs/STANDALONE-TOOLCHAIN.html) for instructions how to create a customized toolchain.

Typically, you'll run a command like:

$NDK/build/tools/make-standalone-toolchain.sh --platform=android-8 --install-dir=$HOME/my-android-toolchain

Then, add the directory containing the toolchain executables to your $PATH:

export PATH=$PATH:$HOME/my-android-toolchain/bin

Compiling the POCO C++ Libraries

When compiling the POCO C++ Libraries for a Android target, as well as when including POCO C++ Libraries headers in a project for a Android target, the preprocessor macro POCO_ANDROID must be defined. This is because the Android NDK GCC compiler does not provide a predefined macro that allows for reliable detection of an Android target.

Restrictions

For the most part, the Linux and Android ports of the POCO C++ Libraries are very similar. However, there are a few restrictions due to the Binoic C library used by Android.

Poco::NamedEvent and Poco::NamedMutex

These classes are not supported on Android. While Poco::NamedEvent and Poco::NamedMutex objects can be created, any attempt to call a method of these classes will result in a Poco::NotImplementedException being thrown.

Poco::SharedMemory

Shared memory is not supported on Android.

Poco::FPEnvironment

The Poco::FPEnvironment class is not available on Android and cannot be used.

Poco::RWLock

On Android, Poco::RWLock is an ordinary mutex.

Build Notes

Using POCO's GNU Make-based Build System

The Android build configuration (located in $POCO_BASE/build/config/Android) is used to cross-build for Android from a Linux or Mac OS X host.

To build the POCO C++ Libraries (static) on a Linux or Mac OS X host:

./configure --config=Android --no-samples --no-tests
./make -s -j4

The default configuration builds for the armeabi platform ABI. To build for armeabi-v7a, set the ANDROID_ABI make variable to armeabi-v7a:

./make -s -j4 ANDROID_ABI=armeabi-v7a

The build configuration also supports setting the ANDROID_ABI to x86, but the NDK r6 standalone toolchain for x86 generated by make-standalone-toolchain.sh lacks the C++ STL headers, so this does not work.

Depending on your specific requirements (e.g., no ARM architecture, etc.), it may be necessary to modify the Android build configuration, or create a new one based on it.

See the GNU Make Build System document for more information.

Using Android's Build System

Alternatively to POCO's build system, Android's build system can be used to build the POCO C++ Libraries. A sample makefile for the Foundation library is shown below.

#
# Android.mk
#
# POCO Foundation
#

include $(CLEAR_VARS)

LOCAL_MODULE     := PocoFoundation
LOCAL_PATH       := $(call my-dir)/src
LOCAL_CFLAGS     := -DPOCO_ANDROID -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_WSTRING -DPOCO_NO_SHAREDMEMORY
LOCAL_CPPFLAGS   := -frtti -fexceptions
LOCAL_C_INCLUDES := $(call my-dir)/include

LOCAL_SRC_FILES := \
    AbstractObserver.cpp \
    ActiveDispatcher.cpp \
    adler32.c \
    ArchiveStrategy.cpp \
    Ascii.cpp \
    ASCIIEncoding.cpp \
    AsyncChannel.cpp \
    AtomicCounter.cpp \
    Base64Decoder.cpp \
    Base64Encoder.cpp \
    BinaryReader.cpp \
    BinaryWriter.cpp \
    Bugcheck.cpp \
    ByteOrder.cpp \
    Channel.cpp \
    Checksum.cpp \
    compress.c \
    Condition.cpp \
    Configurable.cpp \
    ConsoleChannel.cpp \
    CountingStream.cpp \
    crc32.c \
    DateTime.cpp \
    DateTimeFormat.cpp \
    DateTimeFormatter.cpp \
    DateTimeParser.cpp \
    Debugger.cpp \
    deflate.c \
    DeflatingStream.cpp \
    DigestEngine.cpp \
    DigestStream.cpp \
    DirectoryIterator.cpp \
    DynamicAny.cpp \
    DynamicAnyHolder.cpp \
    Environment.cpp \
    ErrorHandler.cpp \
    Event.cpp \
    EventArgs.cpp \
    Exception.cpp \
    File.cpp \
    FileChannel.cpp \
    FileStream.cpp \
    FileStreamFactory.cpp \
    Format.cpp \
    Formatter.cpp \
    FormattingChannel.cpp \
    FPEnvironment.cpp \
    Glob.cpp \
    gzio.c \
    Hash.cpp \
    HashStatistic.cpp \
    HexBinaryDecoder.cpp \
    HexBinaryEncoder.cpp \
    infback.c \
    inffast.c \
    inflate.c \
    InflatingStream.cpp \
    inftrees.c \
    Latin1Encoding.cpp \
    Latin9Encoding.cpp \
    LineEndingConverter.cpp \
    LocalDateTime.cpp \
    LogFile.cpp \
    Logger.cpp \
    LoggingFactory.cpp \
    LoggingRegistry.cpp \
    LogStream.cpp \
    Manifest.cpp \
    MD2Engine.cpp \
    MD4Engine.cpp \
    MD5Engine.cpp \
    MemoryPool.cpp \
    MemoryStream.cpp \
    Message.cpp \
    Mutex.cpp \
    NestedDiagnosticContext.cpp \
    Notification.cpp \
    NotificationCenter.cpp \
    NotificationQueue.cpp \
    NullChannel.cpp \
    NullStream.cpp \
    NumberFormatter.cpp \
    NumberParser.cpp \
    Path.cpp \
    PatternFormatter.cpp \
    pcre_chartables.c \
    pcre_compile.c \
    pcre_exec.c \
    pcre_fullinfo.c \
    pcre_globals.c \
    pcre_maketables.c \
    pcre_newline.c \
    pcre_ord2utf8.c \
    pcre_study.c \
    pcre_tables.c \
    pcre_try_flipped.c \
    pcre_ucd.c \
    pcre_valid_utf8.c \
    pcre_xclass.c \
    Pipe.cpp \
    PipeImpl.cpp \
    PipeStream.cpp \
    PriorityNotificationQueue.cpp \
    Process.cpp \
    PurgeStrategy.cpp \
    Random.cpp \
    RandomStream.cpp \
    RefCountedObject.cpp \
    RegularExpression.cpp \
    RotateStrategy.cpp \
    Runnable.cpp \
    RWLock.cpp \
    Semaphore.cpp \
    SHA1Engine.cpp \
    SharedLibrary.cpp \
    SharedMemory.cpp \
    SignalHandler.cpp \
    SimpleFileChannel.cpp \
    SplitterChannel.cpp \
    Stopwatch.cpp \
    StreamChannel.cpp \
    StreamConverter.cpp \
    StreamCopier.cpp \
    StreamTokenizer.cpp \
    String.cpp \
    StringTokenizer.cpp \
    SynchronizedObject.cpp \
    SyslogChannel.cpp \
    Task.cpp \
    TaskManager.cpp \
    TaskNotification.cpp \
    TeeStream.cpp \
    TemporaryFile.cpp \
    TextBufferIterator.cpp \
    TextConverter.cpp \
    TextEncoding.cpp \
    TextIterator.cpp \
    Thread.cpp \
    ThreadLocal.cpp \
    ThreadPool.cpp \
    ThreadTarget.cpp \
    TimedNotificationQueue.cpp \
    Timer.cpp \
    Timespan.cpp \
    Timestamp.cpp \
    Timezone.cpp \
    Token.cpp \
    trees.c \
    UnicodeConverter.cpp \
    Unicode.cpp \
    URI.cpp \
    URIStreamFactory.cpp \
    URIStreamOpener.cpp \
    UTF8Encoding.cpp \
    UTF8String.cpp \
    UTF16Encoding.cpp \
    UUID.cpp \
    UUIDGenerator.cpp \
    Void.cpp \
    Windows1252Encoding.cpp \
    zutil.c

include $(BUILD_STATIC_LIBRARY)