我的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.h
和jni.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大师也检查一下。)
答案 0 :(得分:2)
在两个版本上运行objdump -x file.so
。这将列出所有sections及其大小。这应该可以为您提供问题所在的线索。 (即是否有一个23KB长的新.debug部分?可能启用了调试模式。)
如果您的代码部分完全不同,请比较objdump -d file.so
的输出。也许您的编译器会自动内联更多代码,从而节省了大量空间。
如果另一部分是新的/不同的,请将输出发布在另一个SO问题中。
答案 1 :(得分:1)
也许之前的.so是使用调试信息生成的 (使用gcc -g选项编译)
答案 2 :(得分:1)
您可以尝试一件事:使用命令大小可执行文件名。这将为您提供可执行代码的不同区域的大小。如果先前的构建可用,则执行相同的操作。您可能会知道更改的位置。