构建android源代码

时间:2012-04-16 09:48:40

标签: android c++ android-intent

我从source.android.com下载了android源代码并按照指令在MAC OS X上设置构建环境,一切都很顺利,除非我运行make make它给了我以下错误

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=darwin
HOST_BUILD_TYPE=release
BUILD_ID=ITL41D
============================================
host C++: aapt <= frameworks/base/tools/aapt/AaptAssets.cpp
frameworks/base/tools/aapt/AaptAssets.cpp:2161:38: warning: unused parameter 'bundle' [-Wunused-parameter]
AaptAssets::slurpResourceZip(Bundle* bundle, const char* filename)
                                     ^
In file included from frameworks/base/tools/aapt/AaptAssets.cpp:5:
In file included from frameworks/base/tools/aapt/AaptAssets.h:10:
In file included from frameworks/base/include/utils/AssetManager.h:25:
frameworks/base/include/utils/KeyedVector.h:193:17: error: use of undeclared identifier 'indexOfKey'
    ssize_t i = indexOfKey(key);
                ^
                this->
frameworks/base/tools/aapt/AaptAssets.h:446:46: note: in instantiation of member function 'android::DefaultKeyedVector<android::String8, android::sp<AaptSymbols> >::valueFor' requested here
        sp<AaptSymbols> sym = mNestedSymbols.valueFor(name);
                                             ^
frameworks/base/include/utils/KeyedVector.h:66:29: note: must qualify identifier to find this declaration in dependent base class
            ssize_t         indexOfKey(const KEY& key) const;
                            ^
1 warning and 1 error generated.
make: *** [out/host/darwin-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1

我刚开始在android中所以没有任何线索,任何小帮助也将不胜感激

4 个答案:

答案 0 :(得分:3)

我终于找到了问题所在。 框架/ base / include / utils / KeyedVector.h的源代码中有错误:193

某些成员函数需要Scope解析运算符“this-&gt;”使用xcode 4.3.x和gcc版本4.9.2(Debian 4.9.2-10)在MAC OS X Lion上构建android源代码。 如果没有范围解析,运算符编译器将无法识别函数的存在。

Open frameworks / base / include / utils / KeyedVector.h

更改第193行:

ssize_t i = indexOfKey(key);

ssize_t i = this->indexOfKey(key);

和Android 4.0.1编译。

答案 1 :(得分:3)

只是为了扩展Pete的答案,万一有人真的想知道:

indexOfKey在DefaultKeyVector的父类KeyedVector中定义。对于类模板,函数调用在编译期间解析,而不是在运行时解析。发生错误是因为在调用indexOfKey时,编译器不知道该模板函数的位置。以下是基类和派生类的外观:

template <typename KEY, typename VALUE>
class KeyedVector
{
...
    ssize_t indexOfKey(const KEY& key) const;
...


template <typename KEY, typename VALUE>
class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
{
...

违规电话:

template<typename KEY, typename VALUE> inline
const VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
    ssize_t i = indexOfKey(key);
...

最有可能的是,使用较旧的MacOS SDK编译器(或其他编译器)可以正常工作,因为它可能只是猜测某个基类中存在的函数,而不是失败。但是,这不是标准行为。

来自此clang entryC++ FAQ的更多信息。

答案 2 :(得分:0)

要在较新的GCC版本上构建ICS,您必须应用这些补丁:

https://groups.google.com/forum/#!msg/android-building/2EwtWQTqjdI/fbZlzXErscwJ

答案 3 :(得分:0)

在使用MAC OS X 10.8.4上的make -j Browser构建Android 4.0.3浏览器时,我多次遇到此问题。我对Android 4.2.1没有任何问题。 所以我的解决方案是

make CC=gcc CXX=g++ -j Browser

希望有所帮助