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.
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
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.
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.
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.
Shared memory is not supported on Android.
The Poco::FPEnvironment class is not available on Android and cannot be used.
On Android, Poco::RWLock is an ordinary mutex.
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.
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)