我很难理解低级编程语言是如何工作的,所以请耐心等待。 我需要将已编译的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。