Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了需要帮助调试共享库无法加载的原因. Android NDK大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用以下命令加载共享库:
    的System.loadLibrary( “sharedC”);
sharedC依赖于另外两个共享库sharedA和sharedB,这三个共享库都是使用独立工具链创建的,并作为预构建的共享库包含在内.我在sharedC之前加载sharedA和sharedB,我知道没有其他依赖项.但是当我尝试加载sharedC时,我得到了一个SEGV.当我运行strace时,这就是我得到的:

writev(3,[{"\3",1},{"dalvikvm\0",9},{"Trying to load lib /data/data/com.exa
mple.Hellojni/lib/libsharedC.so 0x44e8ce28\n\0",83}],3) = 93
stat64("/data/data/com.example.Hellojni/lib/libsharedC.so",{st_dev=makedev(31,1),st_ino=499,st_mode=S_IFREG|0644,st_nlink=1,st_uid=1000,st_gid=1000,st
_blksize=4096,sT_Blocks=24487,st_size=12536908,st_atime=2012/03/22-21:49:35,st_mtime=2012/03/22-14:48:00,st_ctime=2012/03/22-21:49:41}) = 0
open("/data/data/com.example.Hellojni/lib/libsharedC.so",O_RDONLY|O_LARGEFILE
) = 27
lseek(27,SEEK_SET)                  = 0
read(27,"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0°\235\31\0004\0\0\0\4I┐\
0\2\0\0\0054\0 \0\5\0(\0\25\0\24\0\1\0\0pΦ\224║\0Φ\224║\0Φ\224║\0@X\2\0@X\2\0\4\
0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(φ╝\0(φ╝\0\5\0\0\0\0\20\0\0\1\0\0\0
(φ╝\0(²╝\0(²╝\0\234G\2\0\20\202\2\0\6\0\0\0\0\20\0\0\2\0\0\0°»╛\0°┐╛\0°┐╛\0\10\1
\0\0\10\1\0\0\6\0\0\0\4\0\0\0Qσtd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\
0\4\0\0\0\33@\0\0fJ\0\0\0\0\0\0┴G\0\0$,\0\0\222\27\0\0#\2\0\0j)\0\0\1&\0\0\0045\
0\0\16.\0\0"...,4096) = 4096
lseek(27,-8,SEEK_END)                 = 12536900
read(27,"\1\0\0\0\0\0\0\0",8)         = 8
mmap2(0x82000000,12550144,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_ANONymOUS,-1,0) = 0x82000000
mmap2(0x82000000,12381480,MAP_PRIVATE|MAP_FIXED,27,0) =
 0x82000000
mprotect(0x82000000,12382208,PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mmap2(0x82bcf000,152772,PROT_READ|PROT_WRITE,0xbce
) = 0x82bcf000
mmap2(0x82bf5000,12088,MAP_PRIVATE|MAP_FIXED|MAP_ANONymO
US,0) = 0x82bf5000
close(27)                               = 0
mprotect(0x82000000,PROT_READ|PROT_EXEC) = 0
getuid32()                              = 10030
geteuid32()                             = 10030
getgid32()                              = 10030
getegid32()                             = 10030
mprotect(0x41868000,4096,PROT_READ|PROT_WRITE) = 0
mprotect(0x41868000,PROT_READ)   = 0
mprotect(0x41868000,PROT_READ)   = 0
recv(-2136444848,ptrace: umoven: I/O error
0x1,2147483647,0)   = 0
mprotect(0x41868000,PROT_READ)   = 0
...
mprotect(0x42f02000,PROT_READ|PROT_WRITE) = 0
mprotect(0x42f02000,PROT_READ)   = 0
getcwd(0,0)                            = -1 ERANGE (Math result not representab
lE)
brk(0x37f000)                           = 0x37f000
lstat64(".",{st_dev=makedev(0,st_ino=1,st_mode=S_IFDIR|0755,st_nlink=13,st_uid=0,st_gid=0,sT_Blksize=4096,sT_Blocks=0,st_size=0,st_atime=0,st_mti
me=2012/03/22-21:46:13,st_ctime=2012/03/22-21:46:13}) = 0
lstat64("/",st_ctime=2012/03/22-21:46:13}) = 0
getuid32()                              = 10030
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
sigaction(SIGUSR1,{SIG_IGN},{SIG_DFL},0) = 0
SYS_224(0,0xbea811a0,0)   = 224
socket(PF_UNIX,SOCK_STREAM,0)         = 27
connect(27,{sa_family=AF_UNIX,path=@android:debuggerD},20) = 0
write(27,"α\0\0\0",4)                 = 4
read(27,0xbea811cc,1)                 = ? ERESTARTSYS (To be restarted)
read(27,"",1)                         = 0
close(27)                               = 0
sigaction(SIGSEGV,{0xb0001d45,[],SA_RESTART},0) = 0
sigreturn()                             = ? (mask Now [HUP QUIT TRAP ABRT BUS])
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
Process 224 detached

什么出错了?

update 1

好的,调试堆栈跟踪对我来说是新的,但请继续跟进
告诉我,如果我做错了或其他?

有趣的是,似乎我是SEGV正在我身边发生
码??看起来它发生在libgnustl_shared.so中.

所以这是我的堆栈跟踪:

03-23 23:37:14.213: I/DEBUG(28): *** *** *** *** *** *** *** *** ***
*** *** *** *** *** *** ***
03-23 23:37:14.213: I/DEBUG(28): Build fingerprint: 'generic/sdk/
generic/:2.1-update1/ECLAIR/35983:eng/test-keys'
03-23 23:37:14.224: I/DEBUG(28): pid: 332,tid: 332  >>>
com.example.Hellojni <<<
03-23 23:37:14.224: I/DEBUG(28): signal 11 (SIGSEGV),fault addr
00000000
03-23 23:37:14.224: I/DEBUG(28):  r0 00000000  r1 00000000  r2
80808080  r3 00000000
03-23 23:37:14.224: I/DEBUG(28):  r4 00000000  r5 bea8154c  r6
bea81600  r7 00000000
03-23 23:37:14.224: I/DEBUG(28):  r8 bea81820  r9 41971894  10
00000354  fp bea814fc
03-23 23:37:14.224: I/DEBUG(28):  ip 80a81058  sp bea814c0  lr
80a63cd8  pc afe0e7c8  cpsr 40000010
03-23 23:37:14.313: I/DEBUG(28):          #00  pc 0000e7c8  /system/
lib/libc.so
03-23 23:37:14.313: I/DEBUG(28):          #01  pc 00063cd4  /data/data/
com.example.Hellojni/lib/libgnustl_shared.so
03-23 23:37:14.323: I/DEBUG(28): code around pc:
03-23 23:37:14.323: I/DEBUG(28): afe0e7b8 e31c0003 1afffff6 e1a00002
e59f20d8
03-23 23:37:14.323: I/DEBUG(28): afe0e7c8 e490c004 e0433000 f5d0f040
e04c13a2
03-23 23:37:14.323: I/DEBUG(28): afe0e7d8 e0011002 e1d1100c 0490c004
1a000022
03-23 23:37:14.323: I/DEBUG(28): code around lr:
03-23 23:37:14.323: I/DEBUG(28): 80a63cc8 e1a05000 e1a00001 e1a04001
ebff27d0
03-23 23:37:14.323: I/DEBUG(28): 80a63cd8 e1a01004 e1a02000 e1a00005
e8bd4070
03-23 23:37:14.323: I/DEBUG(28): 80a63ce8 eaffffa0 e590c000 e92d45f0
e51ce00c
03-23 23:37:14.323: I/DEBUG(28): stack:
03-23 23:37:14.323: I/DEBUG(28):     bea81480  001479d0  [heap]
03-23 23:37:14.323: I/DEBUG(28):     bea81484  bea81820  [stack]
03-23 23:37:14.323: I/DEBUG(28):     bea81488  41971894  /dev/ashmem/
dalvik-LinearAlloc (deleted)
03-23 23:37:14.323: I/DEBUG(28):     bea8148c  00000354
03-23 23:37:14.334: I/DEBUG(28):     bea81490  bea814fc  [stack]
03-23 23:37:14.334: I/DEBUG(28):     bea81494  00147a24  [heap]
03-23 23:37:14.334: I/DEBUG(28):     bea81498  00000006
03-23 23:37:14.334: I/DEBUG(28):     bea8149c  80a63b58  /data/data/
com.example.Hellojni/lib/libgnustl_shared.so
03-23 23:37:14.334: I/DEBUG(28):     bea814a0  00000006
03-23 23:37:14.334: I/DEBUG(28):     bea814a4  bea81548  [stack]
03-23 23:37:14.334: I/DEBUG(28):     bea814a8  80a82110
03-23 23:37:14.334: I/DEBUG(28):     bea814ac  00000000
03-23 23:37:14.334: I/DEBUG(28):     bea814b0  bea81820  [stack]
03-23 23:37:14.334: I/DEBUG(28):     bea814b4  80a63bcc  /data/data/
com.example.Hellojni/lib/libgnustl_shared.so
03-23 23:37:14.334: I/DEBUG(28):     bea814b8  df002777
03-23 23:37:14.334: I/DEBUG(28):     bea814bc  e3a070ad
03-23 23:37:14.344: I/DEBUG(28): #00 bea814c0  bea814d4  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814c4  00000000
03-23 23:37:14.344: I/DEBUG(28): #01 bea814c8  bea81548  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814cc  bea81548  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814d0  bea81600  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814d4  8131f228  /data/data/
com.example.Hellojni/lib/libsharedB.so
03-23 23:37:14.344: I/DEBUG(28):     bea814d8  afe39190  /system/lib/
libc.so
03-23 23:37:14.344: I/DEBUG(28):     bea814dc  bea8152c  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814e0  001479a0  [heap]
03-23 23:37:14.344: I/DEBUG(28):     bea814e4  bea81548  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814e8  80a8211c
03-23 23:37:14.344: I/DEBUG(28):     bea814ec  001479a0  [heap]
03-23 23:37:14.344: I/DEBUG(28):     bea814f0  bea81548  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814f4  bea81548  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814f8  bea8151c  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea814fc  8131eb8c  /data/data/
com.example.Hellojni/lib/libsharedB.so
03-23 23:37:14.344: I/DEBUG(28):     bea81500  bea8152c  [stack]
03-23 23:37:14.344: I/DEBUG(28):     bea81504  0000272e
03-23 23:37:14.344: I/DEBUG(28):     bea81508  80a82124
03-23 23:37:14.344: I/DEBUG(28):     bea8150c  80a8211c
03-23 23:37:14.884: D/Zygote(30): Process 332 terminated by signal
(11)
03-23 23:37:14.893: I/Activitymanager(52): Process
com.example.Hellojni (pid 332) has died.
03-23 23:37:14.966: I/UsageStats(52): Unexpected resume of
com.android.launcher while already resumed in com.example.Hellojni

基于阅读android-ndk-r7b /我试过这个更好地理解它
文档/ NDK-STACK.html

adb.exe logcat | C:\ndk\android-ndk-r7b\ndk-stack.exe -sym C:\ndk
\android-ndk-r7_google\samples\Hello-jni\obj\local\armeabi

********** Crash dump: **********
Build fingerprint: 'generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/
test-keys'

pid: 332,tid: 332  >>> com.example.Hellojni <<<
signal 11 (SIGSEGV),fault addr 00000000
Stack frame #00  pc 0000e7c8  /system/lib/libc.so
Stack frame #01  pc 00063cd4  /data/data/com.example.Hellojni/lib/
libgnustl_shared.so: Unable to locate routIne information for address
63cd4 in module C:\ndk\android-ndk-r7_google\samples\Hello-jni\obj
\local\armeabi/libgnustl_shared.so

所以,我不知道现在该做什么.我没有创造
libgnustl_shared.so,它只是ndk的一部分.@R_696_10992@,
我加载了一些其他共享库.加载时发生这种情况
最后一个依赖于其他共享库的库
在我首先加载的libgnustl_shared.so上.

还需要哪些其他信息来正确调试此问题?

update 2

为了更好地描述我的项目,我有6个共享库
加载.

一个是libgnustl_shared.so,它加载正常.
接下来是libpcre.so.这是一个预建的共享库.它加载
精细.这是它的readelf:

File: libpcre.so

Dynamic section at offset 0x16d8c contains 23 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000e (SOName)                     Library soname: [libpcre.so]
 0x00000010 (SymBOLIC)                   0x0
 0x00000019 (INIT_ARRAY)                 0x17d78
 0x0000001b (INIT_ARRAYSz)               8 (bytes)
 0x0000001a (FINI_ARRAY)                 0x17d80
 0x0000001c (FINI_ARRAYSz)               12 (bytes)
 0x00000004 (HASH)                       0xb4
 0x00000005 (STRTAB)                     0x858
 0x00000006 (SymTAB)                     0x318
 0x0000000a (STRSz)                      1095 (bytes)
 0x0000000b (SymENT)                     16 (bytes)
 0x00000003 (pltGOT)                     0x17e64
 0x00000002 (pltRELSz)                   192 (bytes)
 0x00000014 (pltREL)                     REL
 0x00000017 (JMPREL)                     0xcf8
 0x00000011 (REL)                        0xca0
 0x00000012 (RELSz)                      88 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000016 (TEXTREL)                    0x0
 0x6ffffffa (RELCOUNT)                   7
 0x00000000 (NULL)                       0x0

接下来是libsharedA.so.这是一个预建的共享库.它加载
精细.这是它的readelf:

File: libsharedA.so

Dynamic section at offset 0xd536c contains 25 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library:
[libgnustl_shared.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000e (SOName)                     Library soname:
[libsharedA.so]
 0x00000010 (SymBOLIC)                   0x0
 0x00000019 (INIT_ARRAY)                 0xd6054
 0x0000001b (INIT_ARRAYSz)               16 (bytes)
 0x0000001a (FINI_ARRAY)                 0xd6064
 0x0000001c (FINI_ARRAYSz)               16 (bytes)
 0x00000004 (HASH)                       0xd4
 0x00000005 (STRTAB)                     0x50cc
 0x00000006 (SymTAB)                     0x175c
 0x0000000a (STRSz)                      8630 (bytes)
 0x0000000b (SymENT)                     16 (bytes)
 0x00000003 (pltGOT)                     0xd6454
 0x00000002 (pltRELSz)                   1832 (bytes)
 0x00000014 (pltREL)                     REL
 0x00000017 (JMPREL)                     0x7ca4
 0x00000011 (REL)                        0x7284
 0x00000012 (RELSz)                      2592 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000016 (TEXTREL)                    0x0
 0x6ffffffa (RELCOUNT)                   219
 0x00000000 (NULL)                       0x0

接下来是libsharedB.so.这是一个预建的共享库.它加载
精细.这是它的readelf:

File: libsharedB.so

Dynamic section at offset 0xea6278 contains 28 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library:
[libsharedA.so]
 0x00000001 (NEEDED)                     Shared library: [libpcre.so]
 0x00000001 (NEEDED)                     Shared library:
[libgnustl_shared.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000e (SOName)                     Library soname:
[libsharedB.so]
 0x00000010 (SymBOLIC)                   0x0
 0x0000000f (RPATH)                      Library rpath: [/home/corbin/
sharedA/.libs:/home/corbin/pcreout/lib]
 0x00000019 (INIT_ARRAY)                 0xe9a000
 0x0000001b (INIT_ARRAYSz)               2032 (bytes)
 0x0000001a (FINI_ARRAY)                 0xe9a7f0
 0x0000001c (FINI_ARRAYSz)               12 (bytes)
 0x00000004 (HASH)                       0xd4
 0x00000005 (STRTAB)                     0xaf734
 0x00000006 (SymTAB)                     0x2ff44
 0x0000000a (STRSz)                      1534855 (bytes)
 0x0000000b (SymENT)                     16 (bytes)
 0x00000003 (pltGOT)                     0xea6378
 0x00000002 (pltRELSz)                   4216 (bytes)
 0x00000014 (pltREL)                     REL
 0x00000017 (JMPREL)                     0x2964e4
 0x00000011 (REL)                        0x2262bc
 0x00000012 (RELSz)                      459304 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000016 (TEXTREL)                    0x0
 0x6ffffffa (RELCOUNT)                   9922
 0x00000000 (NULL)                       0x0

接下来是libsharedC.so.这是一个预建的共享库.它失败
用前面描述的SEGV加载.这是readelf来自
它:

File: libsharedC.so

Dynamic section at offset 0xed7934 contains 29 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library:
[libsharedB.so]
 0x00000001 (NEEDED)                     Shared library:
[libsharedA.so]
 0x00000001 (NEEDED)                     Shared library: [libz.so]
 0x00000001 (NEEDED)                     Shared library:
[libgnustl_shared.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x0000000e (SOName)                     Library soname:
[libsharedC.so]
 0x00000010 (SymBOLIC)                   0x0
 0x0000000f (RPATH)                      Library rpath: [/home/corbin/
libsharedB/.libs:/home/corbin/libsharedA/.libs]
 0x00000019 (INIT_ARRAY)                 0xeb6000
 0x0000001b (INIT_ARRAYSz)               1068 (bytes)
 0x0000001a (FINI_ARRAY)                 0xeb642c
 0x0000001c (FINI_ARRAYSz)               12 (bytes)
 0x00000004 (HASH)                       0xd4
 0x00000005 (STRTAB)                     0xab79c
 0x00000006 (SymTAB)                     0x2f28c
 0x0000000a (STRSz)                      1557316 (bytes)
 0x0000000b (SymENT)                     16 (bytes)
 0x00000003 (pltGOT)                     0xed7a3c
 0x00000002 (pltRELSz)                   45320 (bytes)
 0x00000014 (pltREL)                     REL
 0x00000017 (JMPREL)                     0x296258
 0x00000011 (REL)                        0x227ae0
 0x00000012 (RELSz)                      452472 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000016 (TEXTREL)                    0x0
 0x6ffffffa (RELCOUNT)                   31042
 0x00000000 (NULL)                       0x0

我没有加载第6个共享库,但那就是那个
我在顶部创建,依赖于这些预建共享
库.

当我尝试David’s suggestion时:

03-27 20:13:18.483: I/utils(255): trying dlopen of </data/data/com.example.Hellojni/lib/libpcre.so>
03-27 20:13:18.483: I/utils(255): handle=0xb0012c08 error: Symbol not found: 
03-27 20:13:18.483: I/utils(255): trying dlopen of </data/data/com.example.Hellojni/lib/libsharedA.so>
03-27 20:13:18.503: I/utils(255): handle=0xb0012d20 error: (null)
03-27 20:13:18.515: I/utils(255): trying dlopen of </data/data/com.example.Hellojni/lib/libsharedB.so>
03-27 20:13:19.053: I/utils(255): handle=0xb0012e38 error: (null)
03-27 20:13:19.053: I/utils(255): trying dlopen of </data/data/com.example.Hellojni/lib/libsharedC.so>
03-27 20:13:19.753: I/DEBUG(28): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-27 20:13:19.763: I/DEBUG(28): Build fingerprint: 'generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys'
03-27 20:13:19.773: I/DEBUG(28): pid: 255,tid: 255  >>> com.example.Hellojni <<<
03-27 20:13:19.773: I/DEBUG(28): signal 11 (SIGSEGV),fault addr 00000000
03-27 20:13:19.773: I/DEBUG(28):  r0 00000000  r1 00000000  r2 80808080  r3 00000000
03-27 20:13:19.773: I/DEBUG(28):  r4 00000000  r5 be890574  r6 be890628  r7 00000000
03-27 20:13:19.773: I/DEBUG(28):  r8 80b03a18  r9 be890768  10 4186bc28  fp be890524
03-27 20:13:19.773: I/DEBUG(28):  ip 80a81058  sp be8904e8  lr 80a63cd8  pc afe0e7c8  cpsr 40000010
03-27 20:13:19.863: I/DEBUG(28):          #00  pc 0000e7c8  /system/lib/libc.so
03-27 20:13:19.863: I/DEBUG(28):          #01  pc 00063cd4  /data/data/com.example.Hellojni/lib/libgnustl_shared.so

我看到一个有趣的libpcre,但它是依赖于它的libsharedB,他最终装得很好.但是,我没有得到任何更多的信息,它实际上是通过libsharedC上的SEGV崩溃的.

请告诉我调试需要哪些其他信息.我卡住了,但是
这对我很重要,可以提供所需的任何信息
更好地理解失败.

我也转而使用我的库的静态版本并到达完全相同的位置.

如果我使用基于静态跟踪的addr2line,我得到以下内容

android-linux-addr2line.exe -C -f -e libc.so 0000e7c8
strlen
??:0

android-linux-addr2line.exe -C -f -e libgnustl_shared.so 00063cd4
std::string::operator=(char const*)
??:0

我正在加载的lib是开源的(所以我有代码),我如何找出这个问题的起源?

解决方法

我调试这种废话的方法是创建一个小的帮助程序库,它调用dlopen()并报告任何错误. C代码很长,但几乎都是样板:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <String.h>
#include <jni.h>
#include <dlfcn.h>
#include <android/log.h>

#define  LOG_TAG "utils"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,__VA_ARGS__)
#define  LOGD(...)  __android_log_print(ANDROID_LOG_INFO,__VA_ARGS__)

static void dlopen_impl(jnienv* jenv,jclass clazz,jString path)
{
    int pathlen = jenv->GetStringUTFLength(path);
    char pathb[pathlen + 1];
    jenv->GetStringUTFRegion(path,pathlen,pathb);

    LOGD("trying dlopen of <%s>",pathb);
    void* handle = dlopen(pathb,RTLD_Now);
    LOGD("handle=%p error: %s",handle,dlerror());
}

static int registerNativeMethods(jnienv* env,const char* className,const JNINativeMethod* gMethods,int numMethods)
{
    jclass clazz;

    clazz = env->FindClass(className);
    if (clazz == NULL)
        return -1;

    int result = 0;
    if (env->RegisterNatives(clazz,gMethods,numMethods) < 0)
        result = -1;

    env->deleteLocalRef(clazz);
    return result;
}

extern "C" jint JNI_OnLoad(JavaVM* vm,void *);

__attribute__((visibility("default")))
jint JNI_OnLoad(JavaVM* vm,void *)
{
    jnienv* jenv;
    vm->GetEnv((void**) &jenv,JNI_VERSION_1_4);

    static const JNINativeMethod m[] =
    {
        { "dlopentest","(Ljava/lang/String;)V",(void*) &dlopen_impl },};

    registerNativeMethods(jenv,"com/cowlark/android/Utils",m,sizeof(m)/sizeof(*m));

    return JNI_VERSION_1_4;
}

然后我创建一个java类com.cowlark.android.Utils,如下所示:

package com.antixlabs.agpndk;

import java.io.File;

public class Utils
{
    static
    {
        System.loadLibrary("agputils");
    }

    public native static void dlopentest(String path);
}

在这一切都完成了,我可以将以下代码插入到我的实际应用程序类中:

static
{
    Utils.dlopentest("/data/data/com.cowlark.myapp/lib/libdodgy.so");
}

如果libdodgy.so无法加载,我实际上得到一个实际上提供信息的错误消息.

这个伎俩过去给我节省了这么多时间.

@H_197_125@

大佬总结

以上是大佬教程为你收集整理的需要帮助调试共享库无法加载的原因. Android NDK全部内容,希望文章能够帮你解决需要帮助调试共享库无法加载的原因. Android NDK所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。