如何用Visual C++ 2017编译armeabi原生库并生成Fat APK?
我来帮你搞定这个用Visual C++ 2017编译armeabi原生库和生成Fat APK的问题,结合你提到的细节,整理了具体可操作的步骤:
你提到的AndroidArch属性和GCC编译的问题,核心是要正确配置VS的目标架构和工具链:
通过项目属性设置
AndroidArch
右键你的原生项目 → 属性 → 配置属性 → 常规,找到「目标平台」选项。默认可能是armeabi-v7a,直接手动输入armeabi(注意拼写准确,下拉菜单里没有也没关系,手动填就行)。确认后应用配置,VS就会把目标架构切换为armeabi。手动编辑项目文件兜底
如果上面的图形界面配置不生效,直接打开项目的.vcxproj文件,用文本编辑器找到<AndroidArch>节点,把值改成armeabi,比如:<AndroidArch>armeabi</AndroidArch>保存后重新加载项目,就能生效。
GCC工具链的适配
你之前换GCC后生成的.so还是跑到armeabi-v7a目录,大概率是因为架构配置没改对。另外要注意:Google从NDK r17开始就废弃了armeabi架构,所以你得确保VS2017安装的NDK是r16或更早的版本(VS2017默认的NDK版本一般是支持armeabi的,但最好去「工具→获取工具和功能」里确认NDK组件是否包含armeabi的支持)。
Fat APK就是打包了多架构.so的APK,按下面的步骤来:
编译所有需要的架构的.so
分别为armeabi、armeabi-v7a、arm64-v8a、x86等你需要的架构重复上面的编译步骤,每个架构都会生成对应目录下的.so文件(比如armeabi的.so会在$(SolutionDir)\$(PlatformTarget)\$(Configuration)\lib\armeabi路径下)。配置Android应用项目的支持架构
右键你的Android应用项目(生成APK的那个项目)→ 属性 → Android选项 → 高级,在「支持的架构」里勾选所有你要打包的架构(一定要包含armeabi)。确保.so被正确打包
如果原生项目是Android应用项目的依赖,VS会自动把各架构的.so复制到APK对应的目录里。如果是手动管理的话,把每个架构的.so放到Android应用项目的libs文件夹下对应的子目录(比如libs/armeabi、libs/armeabi-v7a),打包时VS会自动把这些文件整合到APK中,最终生成包含全架构的Fat APK。
额外提醒
由于Google已经废弃了armeabi架构,新的NDK版本不再提供支持,如果你后续需要升级NDK,可能就没法再编译armeabi了。如果不是必须兼容非常老旧的设备,优先考虑用armeabi-v7a及以上的架构会更稳妥。
内容的提问来源于stack exchange,提问作者Carlos

