相同源代码的小文件.so文件

时间:2013-07-14 02:32:04

标签: android c++ linux android-ndk

我的Android应用程序(游戏)使用本机C ++代码进行某些操作。也就是说,我使用的是Android NDK。本机C ++代码仅针对 armeabi 进行编译(默认为 armeabi-v5 )。

上一次我将c ++代码构建到nativestuff.so是几个月前,在另一台计算机上(Windows 7 + cygwin,因为建议使用cygwin进行Android NDK编译)。

我刚刚在当前的PC(Windows 7)上安装了NDK,以及最新的cygwin,并为我的应用程序重建了c ++代码。

令我惊讶的是,它生成了一个14KB的.so文件,而之前的.so文件是37KB。请注意,c ++源文件完全相同(它们一年没有更改),我的项目受版本控制,所以我百分百肯定。

我测试了游戏中的c ++功能,它和以前完全一样,没有任何错误。

我的C ++文件仅使用cstring.hjni.h作为包含。我的Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := nativestuff
LOCAL_SRC_FILES := nativestuff.cpp

include $(BUILD_SHARED_LIBRARY)

知道为什么.so文件大小发生了巨大变化?

(我在这个问题上添加了linux标签,因为这可能是一般性的,所以我想确保linux大师也检查一下。)

3 个答案:

答案 0 :(得分:2)

在两个版本上运行objdump -x file.so。这将列出所有sections及其大小。这应该可以为您提供问题所在的线索。 (即是否有一个23KB长的新.debug部分?可能启用了调试模式。)

如果您的代码部分完全不同,请比较objdump -d file.so的输出。也许您的编译器会自动内联更多代码,从而节省了大量空间。

如果另一部分是新的/不同的,请将输出发布在另一个SO问题中。

答案 1 :(得分:1)

也许之前的.so是使用调试信息生成的 (使用gcc -g选项编译)

答案 2 :(得分:1)

您可以尝试一件事:使用命令大小可执行文件名。这将为您提供可执行代码的不同区域的大小。如果先前的构建可用,则执行相同的操作。您可能会知道更改的位置。