不同 cpu 平台对应的 so 文件问题怎么解决的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
garth

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

  •  
  •   garth Nov 18, 2016 via iPhone 14959 views
    This topic created in 3447 days ago, the information mentioned may be changed or developed.
    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 replies    2016-11-18 16:26:03 +08:00
    VYSE
        1
    VYSE  
       Nov 18, 2016 via Android
    你得加安卓的 linker ,依赖库如 bionic 甚至 framework
    soulshell
        2
    soulshell  
       Nov 18, 2016
    缺少很多必要的概念

    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  
       Nov 18, 2016
    尽量能 Java 解决的就 Java 吧,讲真原生的跨平台兼容性太差了
    pangliang
        4
    pangliang  
       Nov 18, 2016
    "那个 so 文件是优酷 sdk 里的" "网上找了个支持 x86 的优酷应用,解压将里面的 x86 目录复制过来"
    所以你现在用的 so 到底是哪个? 讲道理 sdk 里有就用 sdk 的啊
    garth
        5
    garth  
    OP
       Nov 18, 2016 via iPhone
    @pangliang sdk 里没有 x86 目录,所以一开始是找不到 so 文件问题,后来,我先是把 sdk 里 armeabi-v7a 复制重命名为 x86 ,就出现了此问题,然后用了支持 x86 的优酷应用里的 so 文件还是一样的问题。
    pagxir
        6
    pagxir  
       Nov 18, 2016 via Android
    直接不支持 x86 就 ok 了。 youku 官方都不支持,啥折腾是无用功
    pubby
        7
    pubby  
       Nov 18, 2016 via Android
    x86 手机很多吗?
    reus
        8
    reus  
       Nov 18, 2016
    那些 x86 cpu 的安卓系统,其实是 cpu 支持指令集转换,用的还是 arm 的 apk 啊
    pangliang
        9
    pangliang  
       Nov 18, 2016
    @garth 重命名, 肯定不行的, 错误提示说的很清楚了; 另外...sdk 里没有就别折腾了; 现在有很多模拟器是跑的 arm 指令集的啊
    About     Help     Advertise     Blog     API     FAQ     Solana     4447 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 63ms UTC 04:09 PVG 12:09 LAX 21:09 JFK 00:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86