一直通過property來控制android系統的號碼匹配位數,之前的項目都工作的好好的,但到了KK時,在sqlite庫中引用property的相關方法,卻一直編譯error...
折騰了好久,發現從KK開始google在編譯 libcutils到host static library時,不再將properties.c編譯進庫里,而相應的target static library里是會編進去的,所以問題就來了。sqlite的mk文件里是會將sqlite編進host static庫的,而libcutils在host static中又不包含property的相關方法,所以就導致編譯出錯。。。。另一方面,sqlite也會編進target 的static library,但target的Libcutils里是包含了property的編譯的,所以不會有問題,問題就出來這個Host的編譯上。
解決辦法一:修改libcutils的mk文件,將properties.c編進host static library,這樣host static里的sqlite也可以引用了;
這個方法嘗試了,但關聯實在是多,並非單單加一個properties.c到編譯里這么簡單,這里也要吐槽下google,怎么會改這個地方。
解決方法二:使用宏控制,針對host static的sqlite編譯,不加property的相關引用。
所選擇的宏,可以從 build\core\combo\include\arch\ 里的 AndroidConfig.h里區分出來,這個頭文件是android強制代碼中所有的C和C++文件都會包含的一個頭文件,里面是控制編譯的一些宏。不同的編譯目標會引用不同的AndroidConfig.h文件,比如編譯host的庫時,會引用build\core\combo\include\arch\linux-x86下的AndroidConfig.h,當然前提你的編譯環境是linux-x86的,目前基本都是。。。。編譯target的庫時,如項目目標device是arm平台,那就是build\core\combo\include\arch\linux-arm下的AndroidConfig.h文件。
而在這個頭文件中控制property方法編譯的是 HAVE_LIBC_SYSTEM_PROPERTIES 和 HAVE_SYSTEM_PROPERTY_SERVER 這兩個宏永遠是互斥的。
如下:build\core\combo\include\arch\linux-arm\AndroidConfig.h
/* * Define if libc includes Android system properties implementation. */ #define HAVE_LIBC_SYSTEM_PROPERTIES 1 /* * Define if system provides a system property server (should be * mutually exclusive with HAVE_LIBC_SYSTEM_PROPERTIES). */ /* #define HAVE_SYSTEM_PROPERTY_SERVER */
所以我們使用這個宏來控制編譯就可以避免host static sqlite 庫編譯error。
如下:
#ifdef HAVE_LIBC_SYSTEM_PROPERTIES #include <cutils/properties.h> #endif
