【发布时间】:2015-03-31 10:01:41
【问题描述】:
我正在寻找最好的方法来开发和打包具有不同编译设置但用于相同 ABI 的库的不同变体,然后在运行时选择最适合的库。更具体地说,我想要一个 NEON 和非 NEON armeabi-v7a 版本。
本机库具有第三方链接到的公共 C 接口。他们似乎需要链接到其中一个变体以防止链接错误,但如果它更适合设备,我想在运行时加载替代变体,并让运行时加载器进行正确的重定位。
从我目前看到的情况来看,我似乎需要为两个变体提供相同的文件名,因此需要将它们放在不同的文件夹中。 abi 文件夹下的子文件夹似乎没有被包安装过程复制,因此这种方法不起作用。到目前为止,我看到的最好的建议是手动将一个变体从 res 文件夹复制到已知的设备路径,并使用完整路径调用 System.loadLibrary()。参考:https://groups.google.com/forum/#!topic/android-ndk/zu_dmcmUlMo
- 这仍然是最好的/推荐的方法吗?
- 这将如何与在非 arm 设备上完成的二进制转换交互? (虽然我可以提供 x86 版本,但一些第三方可能会将其排除在他们的 apk 之外)。
我假设使用二进制翻译的设备上的 cpufeatures 不会将 cpu 系列报告为 ARM,所以我建议的解决方案是以正常方式构建标准 armeabi-v7a 库(我猜这会得到二进制翻译) ,并在 res/raw 中发布支持 NEON 的库。然后在运行时,如果 cpufeatures 报告支持 NEON 的 ARM CPU,则复制该库并使用完整路径调用 loadLibrary。有人能看出这种方法有什么问题吗?
【问题讨论】:
标签: android-ndk shared-libraries