1
#define PRINTF(...) ((void)__android_log_print(ANDROID_LOG_INFO, "yaui", __VA_ARGS__))

jfindViewById = (Env)->GetMethodID(cls, "findViewById", "(I)Landroid/view/View;");
for (int i = 0; i < 1000; i++) {
    PRINTF("%i ", i);
    view = (jobject) (Env)->CallObjectMethod(Obj, jfindViewById, N);
}

ループは約 500 回実行され、プログラムはクラッシュします。なぜか理解に苦しむ。メモリ リークまたはリソース リークに違いありませんが、ここで何がリークする可能性がありますか?

実際には、この関数を一度に 1000 回実行する必要はありません。これは、問題を探して作成した最小限のループです。

4

2 に答える 2

0

見つめている

int __android_log_print(int prio, const char *tag, const char *fmt, ...);

したがって、 #define には 2 つの論理パラメーターが必要です。1 つはフォーマット文字列用で、残りはパラメーターです。

#define PRINTF(format, ...) \
  ((void)__android_log_print(ANDROID_LOG_INFO, "yaui", format, __VA_ARGS__))

フォーマット文字列は実際には可変長引数の一部ではありません。ただし、論理的な観点からは、スタックに続く予想されるパラメーターの数を検出するために使用されます。

于 2013-06-07T09:10:47.350 に答える