V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
garth
V2EX  ›  Android

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

  •  
  •   garth · 2016-11-18 09:32:01 +08:00 via iPhone · 10721 次点击
    这是一个创建于 2922 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 吧
    9 条回复    2016-11-18 16:26:03 +08:00
    VYSE
        1
    VYSE  
       2016-11-18 10:34:35 +08:00 via Android
    你得加安卓的 linker ,依赖库如 bionic 甚至 framework
    soulshell
        2
    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
        3
    q397064399  
       2016-11-18 11:13:06 +08:00
    尽量能 Java 解决的就 Java 吧,讲真原生的跨平台兼容性太差了
    pangliang
        4
    pangliang  
       2016-11-18 13:01:00 +08:00
    "那个 so 文件是优酷 sdk 里的" "网上找了个支持 x86 的优酷应用,解压将里面的 x86 目录复制过来"
    所以你现在用的 so 到底是哪个? 讲道理 sdk 里有就用 sdk 的啊
    garth
        5
    garth  
    OP
       2016-11-18 14:39:40 +08:00 via iPhone
    @pangliang sdk 里没有 x86 目录,所以一开始是找不到 so 文件问题,后来,我先是把 sdk 里 armeabi-v7a 复制重命名为 x86 ,就出现了此问题,然后用了支持 x86 的优酷应用里的 so 文件还是一样的问题。
    pagxir
        6
    pagxir  
       2016-11-18 14:59:55 +08:00 via Android
    直接不支持 x86 就 ok 了。 youku 官方都不支持,啥折腾是无用功
    pubby
        7
    pubby  
       2016-11-18 15:11:42 +08:00 via Android
    x86 手机很多吗?
    reus
        8
    reus  
       2016-11-18 15:56:03 +08:00
    那些 x86 cpu 的安卓系统,其实是 cpu 支持指令集转换,用的还是 arm 的 apk 啊
    pangliang
        9
    pangliang  
       2016-11-18 16:26:03 +08:00
    @garth 重命名, 肯定不行的, 错误提示说的很清楚了; 另外...sdk 里没有就别折腾了; 现在有很多模拟器是跑的 arm 指令集的啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1493 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:24 · PVG 01:24 · LAX 09:24 · JFK 12:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.