Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 本机共享库在Android中加载速度变慢_Java_Android Ndk_Java Native Interface_Shared Libraries - Fatal编程技术网

Java 本机共享库在Android中加载速度变慢

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,但问题是相同的。其他一些信息:

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

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 AndroidABI readelf工具获得的节标题表:

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

    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