上次在linux下编译poco,比较麻烦,而且每次编译时都会报错,然后继续输入命令编译,反复几次后才能把库给编译完整。
于是这次采用了第二种方法编译:直接通过android.mk脚本编译。这种方式的好处是不用在linux环境下去编译,而且如果自己愿意折腾的话,可以只编译自己用到的功能,这样就大大减少了文件体积,而且通过脚本能更好的控制相关配置。
脚本在NDK r10d x64 + poco-1.4.7p1-all下编译测试通过。(其他版本可能需要微调参数)
两个文件,一个android.mk,一个build_android.bat
# poco-1.4.7p1-all LOCAL_PATH := $(call my-dir) STL_HOME := E:/Android/android-ndk-r10d/sources/cxx-stl/gnu-libstdc++/4.9 APP_STL := gnustl_shared ##### STL include $(CLEAR_VARS) LOCAL_MODULE := $(APP_STL) LOCAL_SRC_FILES := $(STL_HOME)/libs/$(APP_ABI)/lib$(APP_STL).so LOCAL_EXPORT_C_INCLUDES := $(STL_HOME)/libs/$(APP_ABI)/include include $(PREBUILT_SHARED_LIBRARY) ##### PocoFoundation include $(CLEAR_VARS) LOCAL_MODULE := PocoFoundation LOCAL_CFLAGS := -DPOCO_ANDROID -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_WSTRING -DPOCO_NO_SHAREDMEMORY LOCAL_CPPFLAGS := -std=c++11 -frtti -fexceptions LOCAL_SHARED_LIBRARIES := gnustl_shared LOCAL_C_INCLUDES += $(STL_HOME)/include \ $(LOCAL_PATH)/Foundation/include LOCAL_SRC_FILES := \ Foundation/src/AbstractObserver.cpp \ Foundation/src/ActiveDispatcher.cpp \ Foundation/src/adler32.c \ Foundation/src/ArchiveStrategy.cpp \ Foundation/src/Ascii.cpp \ Foundation/src/ASCIIEncoding.cpp \ Foundation/src/AsyncChannel.cpp \ Foundation/src/AtomicCounter.cpp \ Foundation/src/Base64Decoder.cpp \ Foundation/src/Base64Encoder.cpp \ Foundation/src/BinaryReader.cpp \ Foundation/src/BinaryWriter.cpp \ Foundation/src/Bugcheck.cpp \ Foundation/src/ByteOrder.cpp \ Foundation/src/Channel.cpp \ Foundation/src/Checksum.cpp \ Foundation/src/Clock.cpp \ Foundation/src/compress.c \ Foundation/src/Condition.cpp \ Foundation/src/Configurable.cpp \ Foundation/src/ConsoleChannel.cpp \ Foundation/src/CountingStream.cpp \ Foundation/src/crc32.c \ Foundation/src/DateTime.cpp \ Foundation/src/DateTimeFormat.cpp \ Foundation/src/DateTimeFormatter.cpp \ Foundation/src/DateTimeParser.cpp \ Foundation/src/Debugger.cpp \ Foundation/src/deflate.c \ Foundation/src/DeflatingStream.cpp \ Foundation/src/DigestEngine.cpp \ Foundation/src/DigestStream.cpp \ Foundation/src/DirectoryIterator.cpp \ Foundation/src/DynamicAny.cpp \ Foundation/src/DynamicAnyHolder.cpp \ Foundation/src/Environment.cpp \ Foundation/src/ErrorHandler.cpp \ Foundation/src/Event.cpp \ Foundation/src/EventArgs.cpp \ Foundation/src/Exception.cpp \ Foundation/src/File.cpp \ Foundation/src/FileChannel.cpp \ Foundation/src/FileStream.cpp \ Foundation/src/FileStreamFactory.cpp \ Foundation/src/Format.cpp \ Foundation/src/Formatter.cpp \ Foundation/src/FormattingChannel.cpp \ Foundation/src/FPEnvironment.cpp \ Foundation/src/Glob.cpp \ Foundation/src/Hash.cpp \ Foundation/src/HashStatistic.cpp \ Foundation/src/HexBinaryDecoder.cpp \ Foundation/src/HexBinaryEncoder.cpp \ Foundation/src/infback.c \ Foundation/src/inffast.c \ Foundation/src/inflate.c \ Foundation/src/InflatingStream.cpp \ Foundation/src/inftrees.c \ Foundation/src/Latin1Encoding.cpp \ Foundation/src/Latin2Encoding.cpp \ Foundation/src/Latin9Encoding.cpp \ Foundation/src/LineEndingConverter.cpp \ Foundation/src/LocalDateTime.cpp \ Foundation/src/LogFile.cpp \ Foundation/src/Logger.cpp \ Foundation/src/LoggingFactory.cpp \ Foundation/src/LoggingRegistry.cpp \ Foundation/src/LogStream.cpp \ Foundation/src/Manifest.cpp \ Foundation/src/MD4Engine.cpp \ Foundation/src/MD5Engine.cpp \ Foundation/src/MemoryPool.cpp \ Foundation/src/MemoryStream.cpp \ Foundation/src/Message.cpp \ Foundation/src/Mutex.cpp \ Foundation/src/NestedDiagnosticContext.cpp \ Foundation/src/Notification.cpp \ Foundation/src/NotificationCenter.cpp \ Foundation/src/NotificationQueue.cpp \ Foundation/src/NullChannel.cpp \ Foundation/src/NullStream.cpp \ Foundation/src/NumberFormatter.cpp \ Foundation/src/NumberParser.cpp \ Foundation/src/Path.cpp \ Foundation/src/PatternFormatter.cpp \ Foundation/src/pcre_chartables.c \ Foundation/src/pcre_compile.c \ Foundation/src/pcre_exec.c \ Foundation/src/pcre_fullinfo.c \ Foundation/src/pcre_globals.c \ Foundation/src/pcre_maketables.c \ Foundation/src/pcre_newline.c \ Foundation/src/pcre_ord2utf8.c \ Foundation/src/pcre_study.c \ Foundation/src/pcre_tables.c \ Foundation/src/pcre_try_flipped.c \ Foundation/src/pcre_ucd.c \ Foundation/src/pcre_valid_utf8.c \ Foundation/src/pcre_xclass.c \ Foundation/src/Pipe.cpp \ Foundation/src/PipeImpl.cpp \ Foundation/src/PipeStream.cpp \ Foundation/src/PriorityNotificationQueue.cpp \ Foundation/src/Process.cpp \ Foundation/src/PurgeStrategy.cpp \ Foundation/src/Random.cpp \ Foundation/src/RandomStream.cpp \ Foundation/src/RefCountedObject.cpp \ Foundation/src/RegularExpression.cpp \ Foundation/src/RotateStrategy.cpp \ Foundation/src/Runnable.cpp \ Foundation/src/RWLock.cpp \ Foundation/src/Semaphore.cpp \ Foundation/src/SHA1Engine.cpp \ Foundation/src/SharedLibrary.cpp \ Foundation/src/SharedMemory.cpp \ Foundation/src/SignalHandler.cpp \ Foundation/src/SimpleFileChannel.cpp \ Foundation/src/SplitterChannel.cpp \ Foundation/src/Stopwatch.cpp \ Foundation/src/StreamChannel.cpp \ Foundation/src/StreamConverter.cpp \ Foundation/src/StreamCopier.cpp \ Foundation/src/StreamTokenizer.cpp \ Foundation/src/String.cpp \ Foundation/src/StringTokenizer.cpp \ Foundation/src/SynchronizedObject.cpp \ Foundation/src/SyslogChannel.cpp \ Foundation/src/Task.cpp \ Foundation/src/TaskManager.cpp \ Foundation/src/TaskNotification.cpp \ Foundation/src/TeeStream.cpp \ Foundation/src/TemporaryFile.cpp \ Foundation/src/TextBufferIterator.cpp \ Foundation/src/TextConverter.cpp \ Foundation/src/TextEncoding.cpp \ Foundation/src/TextIterator.cpp \ Foundation/src/Thread.cpp \ Foundation/src/ThreadLocal.cpp \ Foundation/src/ThreadPool.cpp \ Foundation/src/ThreadTarget.cpp \ Foundation/src/TimedNotificationQueue.cpp \ Foundation/src/Timer.cpp \ Foundation/src/Timespan.cpp \ Foundation/src/Timestamp.cpp \ Foundation/src/Timezone.cpp \ Foundation/src/Token.cpp \ Foundation/src/trees.c \ Foundation/src/UnicodeConverter.cpp \ Foundation/src/Unicode.cpp \ Foundation/src/URI.cpp \ Foundation/src/URIStreamFactory.cpp \ Foundation/src/URIStreamOpener.cpp \ Foundation/src/UTF8Encoding.cpp \ Foundation/src/UTF8String.cpp \ Foundation/src/UTF16Encoding.cpp \ Foundation/src/UUID.cpp \ Foundation/src/UUIDGenerator.cpp \ Foundation/src/Void.cpp \ Foundation/src/Windows1250Encoding.cpp \ Foundation/src/Windows1251Encoding.cpp \ Foundation/src/Windows1252Encoding.cpp \ Foundation/src/zutil.c include $(BUILD_SHARED_LIBRARY) ##### PocoData include $(CLEAR_VARS) LOCAL_MODULE := PocoData LOCAL_CFLAGS := -DPOCO_ANDROID -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_WSTRING -DPOCO_NO_SHAREDMEMORY LOCAL_CPPFLAGS := -std=c++11 -frtti -fexceptions LOCAL_SHARED_LIBRARIES := gnustl_shared PocoFoundation LOCAL_C_INCLUDES += $(STL_HOME)/include \ $(LOCAL_PATH)/Foundation/include \ $(LOCAL_PATH)/Data/include LOCAL_SRC_FILES := \ Data/src/AbstractBinder.cpp \ Data/src/AbstractBinding.cpp \ Data/src/AbstractExtraction.cpp \ Data/src/AbstractExtractor.cpp \ Data/src/AbstractPreparation.cpp \ Data/src/AbstractPrepare.cpp \ Data/src/BLOB.cpp \ Data/src/BLOBStream.cpp \ Data/src/Connector.cpp \ Data/src/DataException.cpp \ Data/src/Limit.cpp \ Data/src/MetaColumn.cpp \ Data/src/PooledSessionHolder.cpp \ Data/src/PooledSessionImpl.cpp \ Data/src/Range.cpp \ Data/src/RecordSet.cpp \ Data/src/Session.cpp \ Data/src/SessionFactory.cpp \ Data/src/SessionImpl.cpp \ Data/src/SessionPool.cpp \ Data/src/Statement.cpp \ Data/src/StatementCreator.cpp \ Data/src/StatementImpl.cpp include $(BUILD_SHARED_LIBRARY) ##### PocoDataSQLite include $(CLEAR_VARS) LOCAL_MODULE := PocoDataSQLite LOCAL_CFLAGS := -DPOCO_ANDROID -DPOCO_NO_FPENVIRONMENT -DPOCO_NO_WSTRING -DPOCO_NO_SHAREDMEMORY LOCAL_CFLAGS += \ -DSQLITE_THREADSAFE=1 \ -DSQLITE_DISABLE_LFS \ -DSQLITE_OMIT_UTF16 \ -DSQLITE_OMIT_PROGRESS_CALLBACK \ -DSQLITE_OMIT_COMPLETE \ -DSQLITE_OMIT_TCL_VARIABLE \ -DSQLITE_OMIT_DEPRECATED \ -DSQLITE_OMIT_WAL \ -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_HOMEGROWN_RECURSIVE_MUTEX \ -DOS_VXWORKS=551 LOCAL_CPPFLAGS := -std=c++11 -frtti -fexceptions LOCAL_SHARED_LIBRARIES := gnustl_shared PocoFoundation PocoData LOCAL_C_INCLUDES += $(STL_HOME)/include \ $(LOCAL_PATH)/Foundation/include \ $(LOCAL_PATH)/Data/include \ $(LOCAL_PATH)/Data/SQLite/include LOCAL_SRC_FILES := \ Data/SQLite/src/Binder.cpp \ Data/SQLite/src/Connector.cpp \ Data/SQLite/src/Extractor.cpp \ Data/SQLite/src/SQLiteException.cpp \ Data/SQLite/src/SQLiteStatementImpl.cpp \ Data/SQLite/src/SessionImpl.cpp \ Data/SQLite/src/Utility.cpp \ Data/SQLite/src/sqlite3.c include $(BUILD_SHARED_LIBRARY)
注意:下面的%NDK_HOME%是ndk根目录路径。
cd /d %~dp0 set NDK_PROJECT_PATH=. set APP_ABI=armeabi set NDK_TOOLCHAIN_VERSION=4.9 set APP_PLATFORM=android-8 set APP_OPTIM=release set NDK_DEBUG=0 %NDK_HOME%\ndk-build.cmd APP_BUILD_SCRIPT=%NDK_PROJECT_PATH%\Android.mk NDK_TOOLCHAIN_VERSION=%NDK_TOOLCHAIN_VERSION% APP_ABI=%APP_ABI% APP_PLATFORM=%APP_PLATFORM% APP_OPTIM=%APP_OPTIM% NDK_DEBUG=%NDK_DEBUG% NDK_PROJECT_PATH=%NDK_PROJECT_PATH%
编译的所有参数在这两个文件中修改。要增加编译的模块直接在android.mk中添加。
最后将两个文件放在poco根目录下,运行批处理开始编译,等待编译完成后在libs目录下就是最终的二进制文件了。