Contents
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)