1

source.android.com から Android ソースをダウンロードし、指示に従って MAC OS X でビルド環境をセットアップしました。

============================================
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

私はアンドロイドを始めたばかりなので、手がかりがありません。小さな助けもいただければ幸いです

4

4 に答える 4

3

私はついに問題を理解しました。Frameworks/base/include/utils/KeyedVector.h:193 のソースコードにエラーがあります

一部のメンバー関数では、xcode 4.3.x を使用する MAC OS X Lion および gcc バージョン 4.9.2 (Debian 4.9.2-10) で Android ソースをビルドするために、スコープ解決演算子「this->」が必要です。スコープ解決演算子がないと、コンパイラは関数の存在を識別できません。

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 に答える