POCO C++ Libraries Android Platform Notes
AAAIntroduction

!!!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 [[99150-GMakeBuildNotes.html 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)
----
