gpt4 book ai didi

java - native 共享库在 Android 中加载速度变慢

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:00 26 4
gpt4 key购买 nike

我在 libs/armeabi 文件夹中放置了一个共享库。它是使用

加载的
System.loadLibrary("library_name.so");

库的大小约为 3MB。加载时间很长。它有时会持续将近 20 秒。它阻止了我的 GUI。我试图将 System.loadLibrary("library_name.so"); 放在不同的线程中,但我的 GUI 仍然被阻止。我知道其他应用程序使用更大的 .so 文件,但加载时间并不长。可能是什么问题?

编辑

3MB 是调试版本的大小。 Release版本大约800KB,但问题是一样的。一些附加信息:

  • .so 包含我的两个循环连接的 c++ 库
  • 运行arm-linux-androideabi-nm -D -C -g library_name.so显示了很多函数和变量
  • 我不再使用 LOCAL_WHOLE_STATIC_LIBRARIES
  • 这里是使用arm-linux-androideabi-readelf-tool获取的section headers表:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al

[ 0] NULL 00000000 000000 000000 00 0 0 0

[ 1] .dynsym DYNSYM 00000114 000114 00b400 10 A 2 1 4

[ 2] .dynstr STRTAB 0000b514 00b514 015b0c 00 A 0 0 1

[ 3] .hash HASH 00021020 021020 004d1c 04 A 1 0 4

[ 4] .rel.dyn REL 00025d3c 025d3c 006e98 08 A 1 0 4

[ 5] .rel.plt REL 0002cbd4 02cbd4 000468 08 A 1 6 4

[ 6] .plt PROGBITS 0002d03c 02d03c 0006b0 00 AX 0 0 4

[ 7] .text PROGBITS 0002d6f0 02d6f0 08e6e0 00 AX 0 0 8

[ 8] .ARM.extab PROGBITS 000bbdd0 0bbdd0 00bad0 00 A 0 0 4

[ 9] .ARM.exidx ARM_EXIDX 000c78a0 0c78a0 005b80 08 AL 7 0 4

[10] .rodata PROGBITS 000cd420 0cd420 005cc0 00 A 0 0 4

[11] .data.rel.ro.loca PROGBITS 000d46d8 0d36d8 0006e4 00 WA 0 0 4

[12] .fini_array FINI_ARRAY 000d4dbc 0d3dbc 000008 00 WA 0 0 4

[13] .init_array INIT_ARRAY 000d4dc4 0d3dc4 00009c 00 WA 0 0 4

[14] .data.rel.ro PROGBITS 000d4e60 0d3e60 00384c 00 WA 0 0 8

[15] .dynamic DYNAMIC 000d86ac 0d76ac 000100 08 WA 2 0 4

[16] .got PROGBITS 000d87ac 0d77ac 000854 00 WA 0 0 4

[17] .data PROGBITS 000d9000 0d8000 000648 00 WA 0 0 8

[18] .bss NOBITS 000d9648 0d8648 047271 00 WA 0 0 8

[19] .comment PROGBITS 00000000 0d8648 000026 01 MS 0 0 1

[20] .note.gnu.gold-ve NOTE 00000000 0d8670 00001c 00 0 0 4

[21] .ARM.attributes ARM_ATTRIBUTES 00000000 0d868c 00002d 00 0 0 1

[22] .shstrtab STRTAB 00000000 0d86b9 0000d8 00 0 0 1

最佳答案

尝试减少共享库中导出函数的数量。你可以使用

arm-linux-androideabi-nm -D -C -g library_name.so

并检查该列表是否过长,并删除您不使用的列表(将它们声明为静态的)。您可以通过 $man nm 查看 nm 的手册,了解如何使用和解释它。

如果您需要使用很多功能,请使用 RegisterNatives()注册您的函数而不是依赖名称修改和查找 - 这就是您为函数命名时所做的事情,例如 Java_your_path_YourClass_yourFunction

你也可以尝试strip (arm-linux-androideabi-strip) 你的库,如果它有符号的话。

为避免阻塞 UI,您可以尝试在不同的线程中尽早加载您的共享库并等待它。

如果公开静态库不是我最终想要的,我不会使用 LOCAL_WHOLE_STATIC_LIBRARIES。

LOCAL_WHOLE_STATIC_LIBRARIES

  • These are the static libraries that you want to include in your module without allowing the linker to remove dead code from them.
  • This is mostly useful if you want to add a static library to a shared library and have the static library's content exposed from the shared library.

尝试解决该问题,而不是解决一些构建问题。

关于java - native 共享库在 Android 中加载速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14962881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com