Java 本机共享库在Android中加载速度变慢
我在libs/armeabi文件夹中有一个共享库。它是使用Java 本机共享库在Android中加载速度变慢,java,android-ndk,java-native-interface,shared-libraries,Java,Android Ndk,Java Native Interface,Shared Libraries,我在libs/armeabi文件夹中有一个共享库。它是使用 System.loadLibrary("library_name.so"); 该库的大小约为3MB。装载时间很长。有时会持续近20秒。它阻塞了我的GUI。我试着把System.loadLibrary(“library\u name.so”)在不同的线程中,但我的GUI仍然被阻止。我知道其他应用程序使用更大的文件,但加载时间并没有那么长。有什么问题吗 编辑 3MB是调试版本的大小。发布版本大约为800KB,但问题是相同的。其他一些信息:
System.loadLibrary("library_name.so");
该库的大小约为3MB。装载时间很长。有时会持续近20秒。它阻塞了我的GUI。我试着把System.loadLibrary(“library\u name.so”)代码>在不同的线程中,但我的GUI仍然被阻止。我知道其他应用程序使用更大的文件,但加载时间并没有那么长。有什么问题吗
编辑
3MB是调试版本的大小。发布版本大约为800KB,但问题是相同的。其他一些信息:
因此包含两个循环连接的C++库
- 运行armlinux androideabi nm-D-C-g库_name.so
显示了许多函数和变量
LOCAL\u-WHOLE\u-STATIC\u库
尝试减少共享库中导出函数的数量。你可以用
arm-linux-androideabi-nm -D -C -g library_name.so
检查该列表是否过长,并删除不使用的列表(声明为静态)。您可以通过$man nm
查阅nm
的手册,了解如何使用和解释手册
如果需要使用很多函数,请使用来注册函数,而不是依赖名称混乱和查找-当您为函数命名时,如Java\u-your\u-path\u-your-class\u-your-function
如果库中有符号,也可以尝试剥离(arm linux AndroidABI剥离)
为了避免阻塞UI,您可以尝试在不同的线程中尽早加载共享库并等待它
如果公开静态库不是我最终想要的,我就不会使用本地的、整个的、静态的库
本地\u整体\u静态\u库
- 这些是您希望包含在模块中的静态库,而不允许链接器从中删除死代码
- 如果要将静态库添加到共享库中,并从共享库中公开静态库的内容,则此选项非常有用
尝试解决该问题,而不是解决一些构建问题。问题是某些构造函数中的静态初始化,需要花费很多时间来完成。库中有多少方法?您是如何向JNI注册它们的(通过registernations
还是通过给它们Java\ucode>名称)?@fadden我有5个导出函数。它们是使用RegisterNatives()注册的。这些方法使用C++库中的函数。也许问题是,整个C++库都包含在我的.so文件中。这表明许多函数都已注册。我认为问题的出现是因为我使用的是LOCAL\u-WHOLE\u-STATIC\u库
,没有itI无法构建我的项目。我有5个导出函数。它们是使用RegisterNatives()注册的。我应该在哪里使用这个arm linux AndroidABI nm-D-C-g库\u name.so
?如果你没有运行它,你怎么知道你有多少导出函数?你可以在ndk.No中找到这个nm。你应该用nm检查so文件。运行这个工具后,我得到了很多数据。在前面提到的这5个函数中,我使用C++库中的函数。如果不设置LOCAL\u-WHOLE\u-STATIC\u库
,我无法构建我的项目。我认为这是造成问题的原因
arm-linux-androideabi-nm -D -C -g library_name.so