我们正在开发一个带有本地部分的Android库。我们大多数是Java开发人员,不是C ++开发人员。我们微小的C ++经验足以编写我们需要的本地代码,但我们遇到了与剥离相关的意外麻烦(这与直接编程无关)。由于某些原因,我们确实需要输出剥离后的本地库(xxx.so文件)。问题是很难找到如何在我们特定情况下执行此操作的信息。谷歌上有很多结果,但我们不知道如何应用它们。最流行的答案是“只需在IDE中勾选相关复选框”。嗯,哪个复选框?我们尝试将配置中的
Jni Debuggable 复选框设置为true(它看起来相关)-没有效果。我们按照以下方式添加-s标志(如许多答案所建议):
defaultConfig {
..
externalNativeBuild {
cmake {
cppFlags "-fexceptions -s"
abiFilters 'armeabi', 'x86'
}
}
}
没有效果。我们根据这个回答添加了相同的标志,如下所示:
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -s")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -s")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
再次无效!最终,我们尝试了直接对输出库手动应用strip实用程序的简单变体(正如许多人建议的那样)。 问题在于该实用程序显示“无法识别输入文件'xxx.so'的格式”。 奇怪...我们的C ++开发人员(不适用于Android)无法帮助我们,他们“只是在IDE中勾选了相关复选框”。 我们非常确定这不应该很难,但是花费了很多时间来完成此任务并阅读了大量页面,但没有结果。
@anton-malyshev是正确的! 我之前使用的elfedit和objdump来自同一软件包,并且它们与使我困惑的相同文件配合良好。 我应用了NDK中适当的strip命令,现在它可以正常工作而不出错,但仍然没有效果。 我使用了
strip -s -v xxx.so
这段文本涉及到IT技术,其中包括语法。它显示了一条消息: 从'xxx.so' [elf32-littlearm]复制到'sta10988' [elf32-littlearm],但是'xxx.so'文件没有发生改变。那么'sta10988'是什么?一个临时文件吗?如果我的理解正确,那么这个实用工具应该能够减小库的大小,因为它包含很多符号(根据elfedit和objdump)。我尝试过应用其他strip选项(比如-I和-O),但是没有成功运行任何组合。抱歉,我不喜欢控制台应用程序。如何正确使用这个实用工具呢?