1

我从 source.android.com 下载了 android 源代码并按照说明在 MAC OS X 上设置构建环境,一切都很好,除非我运行 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

4 回答 4

3

我终于弄清楚了问题所在。frameworks/base/include/utils/KeyedVector.h:193的源代码有错误

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

打开 frameworks/base/include/utils/KeyedVector.h

将第 193 行更改为:

ssize_t i = indexOfKey(key);

ssize_t i = this->indexOfKey(key);

和 Android 4.0.1 编译。

于 2012-04-18T04:55:48.987 回答
3

只是为了扩展皮特的答案,以防有人真的想知道:

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 条目C++ FAQ的更多信息。

于 2012-09-13T15:38:17.927 回答
0

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

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

于 2013-04-12T13:17:39.800 回答
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

希望能帮助到你

于 2013-08-13T08:12:31.850 回答