相同源代码的.so文件要小得多
Much smaller .so file for identical source code
我的Android应用程序(游戏)使用本机C++代码进行某些操作。也就是说,我使用的是安卓NDK。本机C++代码仅为armeabi编译(默认情况下为armeabi-v5)。
我上一次在nativestuff.so
中构建c++代码是几个月前,在另一台计算机上(Windows 7+cygwin,因为建议使用Android NDK编译cygwin)。
我刚刚在我现在的电脑(Windows7)上安装了NDK,以及最新的cygwin,并为我的应用程序重建了c++代码。
令我惊讶的是,它生成了一个14KB的.so
文件,而之前的.so
文件是37KB。请注意,c++源文件完全相同(它们已经一年没有更改了),我的项目处于版本控制之下,所以我100%确定。
我在游戏中测试了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大师也检查它。)
在两个版本上运行objdump -x file.so
。这将列出所有部分及其大小。这应该能让你知道问题出在哪里。(即,是否有23KB长的新.debug部分?可能启用了调试模式。)
如果您的代码部分完全不同,请比较objdump -d file.so
的输出。也许你的编译器自动内联了更多的代码,这节省了很多空间。
如果另一个部分是新的/不同的,则将输出发布在另一个SO问题中。
也许前面的.so是用调试信息生成的
(使用gcc-g选项编译)
您可以尝试一件事:使用命令大小的可执行文件名。这将为您提供可执行代码的不同区域的大小。如果上一个版本可用,请执行同样的操作。您可能会知道更改的位置。
- 如何使用ndk-build.cmd构建Android.so文件
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 如何从构建 libgpio.so 的生成文件构建libgpio.a
- 用于构建 cuda .so 文件(共享库)的生成文件
- 无法从 SO 文件调用 SO 文件的函数 - C++生成文件
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 C++ 的 .so 文件中包含库
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- 为什么C++可执行文件在与较新的libstdc++.so链接时运行得更快?
- Google Colab 看不到 .so 文件
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 如何在 Linux 中从 .so 文件打开可执行文件?
- 如何在makefile中包含tensorflow c ++".so"文件?
- 缺少 .h 文件,尽管从库文件夹链接了 .so 文件
- 如何在 CMake 超级生成中查找 dll/so 文件
- 如何用.so文件linux打包所有需要的库
- 如何调试visual studio 2017生成的C++代码.android中的SO文件和其他第三方库
- 如何使用 gnu c++ 程序获取共享对象文件(.so 文件)的体系结构
- EMF文件(.so)调试,符号找不到VTable错误
- 如何将c++库作为共享对象文件(.so)加载到Python中?