如何确定ndk-build的gcc优化级别

4

我正在使用 NDK(jni)在 Android 上编写一些本地代码。

我希望关闭 gcc 编译器的优化。

目前,我在 Android.mk 文件中添加了 LOCAL_CFLAGS += -O0,不确定是否生效。

我编写了一些用于测试循环开销的代码:

// gettime
for(int i = 0 ; i<10000;i++)
{

}
// gettime

时间差太小了,我确信循环已经被编译器删除了。我可以将i更改为volatile变量,但我想测试是否正确关闭了编译器优化。

我如何知道gcc(ndk-build)使用的优化级别,我可以设置make为详细模式以获取所有消息吗?

提前感谢。


10k个“inc”操作很可能在10k个时钟周期内完成。即使在“慢”处理器上,这也非常快。 - Mat
2个回答

8
请看这里如何禁用优化: Android NDK assert.h problems 基本上你需要做的是添加:
APP_OPTIM := debug

添加到你的Application.mk文件中


6

启用优化时,编译器将定义一个名为__OPTIMIZE__的宏。

如果您将这些行插入到任何C文件中,则如果您的make标志未针对该文件工作,则编译将失败。

#ifdef __OPTIMIZE__
#error Optimization enabled. That's not right!
#endif

另一种可能性是检查已构建的二进制文件(.o或可执行文件)上的特定于体系结构的标志。
readelf -A myfile.o

ARM有一个标志,指示优化级别,但我认为Android工具链可能有点过时,无法正确使用该标志,所以结果可能因人而异。

是的,我用你的代码进行了检查,-O0 不起作用,编译器只会抛出错误信息。那么如何正确地关闭 Android-JNI 项目的优化呢? - Gen Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接