不同 cpu 平台对应的 so 文件问题怎么解决的

2016-11-18 09:32:01 +08:00
 garth
Android 手机 cpu 大部分是 arm ,但也有 x86 的等等。在使用优酷 SDK 时就遇到了这样子一个问题:
Android Studio 开发,使用 x86 的虚拟机调试出现如下错误
java.lang.UnsatisfiedLinkError: dlopen failed: "...*.so" has unexpected e_machine: 40
那个 so 文件是优酷 sdk 里的,我将它放在 x86 目录下了,没 x86 目录时直接报找不到 so 文件。
网上找了个支持 x86 的优酷应用,解压将里面的 x86 目录复制过来,还是出现此错误。真是怪了,在 PC 里用 arm 的虚拟机太慢了不实际。难道真的要买部真机来调试?但最好还是能兼容 x86 吧
10792 次点击
所在节点    Android
9 条回复
VYSE
2016-11-18 10:34:35 +08:00
你得加安卓的 linker ,依赖库如 bionic 甚至 framework
soulshell
2016-11-18 11:05:51 +08:00
缺少很多必要的概念

so 文件是二进制文件,编译后和体系架构相关的,不同的体系架构下要有对应的 so 文件,用 file 或者 readelf 看下就知道了,你在 x86 上调试 android 的代码,最典型的的做法是 google 帮你做了 studio 里面用的 qemu ,将 x86 的汇编转换成 arm 的汇编进行执行的

qemu 使用了 qemu 的 binary translation 的机制导致你在 x86 上运行 arm 的的代码会很慢,现在看起来你是想在 x86 上直接运行针对 x86 的 android app ,也可以,但是因为指令差别,只能在 x86 的手机上跑,无法测试覆盖到 arm 架构的手机

再往上就是 java 里面的 jni 调用,使用 so 库里面的 c 或者 cpp 的 api ,但是执行 java 的环境是根据 android 里面环境构建的 jvm , bonic 这些,所以你需要把这个 runtime 做一些调整

从下到上,就是这样一个过程

也可以不买手机,你说的那个需求现在也是一门生意,有很多人在做云端的测试平台,可以到 AWS 上找一下 test farm ,可以满足你的需求
q397064399
2016-11-18 11:13:06 +08:00
尽量能 Java 解决的就 Java 吧,讲真原生的跨平台兼容性太差了
pangliang
2016-11-18 13:01:00 +08:00
"那个 so 文件是优酷 sdk 里的" "网上找了个支持 x86 的优酷应用,解压将里面的 x86 目录复制过来"
所以你现在用的 so 到底是哪个? 讲道理 sdk 里有就用 sdk 的啊
garth
2016-11-18 14:39:40 +08:00
@pangliang sdk 里没有 x86 目录,所以一开始是找不到 so 文件问题,后来,我先是把 sdk 里 armeabi-v7a 复制重命名为 x86 ,就出现了此问题,然后用了支持 x86 的优酷应用里的 so 文件还是一样的问题。
pagxir
2016-11-18 14:59:55 +08:00
直接不支持 x86 就 ok 了。 youku 官方都不支持,啥折腾是无用功
pubby
2016-11-18 15:11:42 +08:00
x86 手机很多吗?
reus
2016-11-18 15:56:03 +08:00
那些 x86 cpu 的安卓系统,其实是 cpu 支持指令集转换,用的还是 arm 的 apk 啊
pangliang
2016-11-18 16:26:03 +08:00
@garth 重命名, 肯定不行的, 错误提示说的很清楚了; 另外...sdk 里没有就别折腾了; 现在有很多模拟器是跑的 arm 指令集的啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/321371

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX