在Android

时间:2017-08-03 21:50:50

标签: android c android-ndk

我很难理解低级编程语言是如何工作的,所以请耐心等待。 我需要将已编译的C(.so文件)库加载到android 6.0+(SdkVersion:23 +)

使用:

static {
    System.loadLibrary("dsdrv");
}

我收到错误:

FATAL EXCEPTION: main
Process: com.logicants.scanner3, PID: 11415
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.logicants.scanner3-1/lib/arm/libdsdrv.so" has unexpected e_machine: 3
    at java.lang.Runtime.loadLibrary(Runtime.java:372)
    at java.lang.System.loadLibrary(System.java:1076)
    at com.logicants.scanner3.MainActivity.<clinit>(MainActivity.java:13)
    at java.lang.Class.newInstance(Native Method)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1072)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2478)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2665)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1499)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:207)
    at android.app.ActivityThread.main(ActivityThread.java:5765)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:683)

我在互联网上做了一些挖掘,发现了这个:https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-runtime

“在Android的早期版本中,如果您的应用程序要求系统加载带有文本重定位的共享库,系统会显示警告但仍允许加载库。从此版本开始,系统拒绝此库您的应用程序的目标SDK版本为23或更高。为了帮助您检测库是否无法加载,您的应用程序应记录dlopen(3)失败,并包含dlerror(3)调用返回的问题描述文本。要了解更多信息有关处理文本重定位的信息,请参阅本指南。“

所以,基本上它失败的原因是:TEXTREL

readelf -a dsdrv.so | grep TEXTREL

不返回任何内容

readelf -d dsdrv.so

返回:

 Dynamic section at offset 0x5bd28 contains 24 entries:
   Tag        Type                         Name/Value
  0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
  0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
  0x00000001 (NEEDED)                     Shared library: [libm.so.6]
  0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
  0x00000001 (NEEDED)                     Shared library: [libc.so.6]
  0x0000000c (INIT)                       0xd3bc
  0x0000000d (FINI)                       0x4aec8
  0x6ffffef5 (GNU_HASH)                   0xd4
  0x00000005 (STRTAB)                     0x4f30
  0x00000006 (SYMTAB)                     0x1930
  0x0000000a (STRSZ)                      24307 (bytes)
  0x0000000b (SYMENT)                     16 (bytes)
  0x00000003 (PLTGOT)                     0x5d154
  0x00000002 (PLTRELSZ)                   2304 (bytes)
  0x00000014 (PLTREL)                     REL
  0x00000017 (JMPREL)                     0xcabc
  0x00000011 (REL)                        0xb5e4
  0x00000012 (RELSZ)                      5336 (bytes)
  0x00000013 (RELENT)                     8 (bytes)
  0x6ffffffe (VERNEED)                    0xb4e4
  0x6fffffff (VERNEEDNUM)                 5
  0x6ffffff0 (VERSYM)                     0xae24
  0x6ffffffa (RELCOUNT)                   44
  0x00000000 (NULL)                       0x0

所以,我假设它由于其中一个共享库而失败。 我没有库的源代码只是编译的* .so文件。

我该如何解决这个问题?是否可以反编译* .so文件并重新编译它,因此它不会使用TEXTREL。

0 个答案:

没有答案