Android NDK中的Debug版本和Release版本的区别

9
我正在开发一个大型游戏引擎,需要将其移植到Android平台。所有代码都是C/C++编写的,因此我们通过NDK进行移植。我已经构建了所有内容,但是在大量搜索后,我仍然不确定构建Debug和Release版本.so文件的最佳方法。每次手动更改都很麻烦。
你是否为每个目标拥有不同的Application.mk文件?或者在jni/目录下有一种包含多个目标的单个Android.mk文件的方法?或者第三种选择可能是编写一个标准makefile,设置环境变量,然后Android.mk文件使用这些变量来通知构建过程?
最后,关于必须在AndroidManifest.xml文件中设置android:debuggable标志的最后一个问题。这是否对复制到设备上的生成的本地代码产生任何影响?
最好的问候,
Kevin

那么,你如何手动选择Debug或Release呢?NDK示例似乎没有任何调试或发布标志,也没有使用-Ox选项。 - Qwertie
3个回答

10

你为每个目标都有不同的Application.mk文件吗?

没有。我使用单独的子目录,每个子目录都有自己的Android.mk(共享和静态库),但只有一个Application.mk。

我的Application.mk只包含:

APP_STL := gnustl_static
APP_OPTIM := debug

我仍然不确定构建我们的.so文件的最佳方法是什么。每次手动更改都变得很老套。
对于我来说,使用jni/Android.mk + Application.mk布局有点分散。
Application.mk具有APP_OPTIM:= debug 然后在AndroidManifest.xml的应用程序元素中,我有android:debuggable =“true” 当您使用ndk-build构建时,它使用此清单标志来确定优化(关闭或打开优化非常有用,关闭以进行分析等)。
(有点离题)我最近遇到了

https://code.google.com/p/android-ndk-profiler/

结合 http://code.google.com/p/jrfonseca/wiki/Gprof2Dot,可以生成一些漂亮的图像,帮助我更好地理解手机上的运行情况。

1
是的,我已经做了所有这些事情 - 我最终做的是为每个目标(发布/调试)拥有不同的Application.mk。然后在每个文件(Release.mk / Debug.mk)中,我通过APP_CFLAGS指定全局c标志,并从标准makefile中调用ndk-build,指定Release.mk或Debug.mk。 - Kevin Depue
我发现自己做的更多的是性能分析而不是调试,每个子项目都有一些需要设置/过滤的标志(例如-fomit-frame-pointer和-pg不兼容),所以在我的情况下这需要更多的工作,因为我不想让整个库链都使用-pg。 - dwerner

1

你不必使用Android.mk系统来构建你的.so文件。个人而言,我使用自己的Makefile,并且定义所需的目标,这样可以非常标准化地指定调试和发布版本的构建。


Android.mk文件是否支持在单个文件中设置多个目标?我希望能够通过他们的系统来解决这个问题。 - Kevin Depue
我们也使用自己的构建系统(而不是NDK),但请注意这需要很多工作。你一定要构建一些示例NDK项目,并确保你理解NDK在编译器标志等方面所做的一切。(我们不使用NDK,因为我们还进行了许多非Android构建;仅将NDK用于Android甚至比为所有内容使用我们自己的构建系统还要费力)。 - James Moore

1
我使用单个文件来构建适用于不同目标的库。在Application.mk中添加“APP_ABI:= armeabi armeabi-v7a”即可正常工作。

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