Java 在Android中加载静态C++库时阻塞UI

Java 在Android中加载静态C++库时阻塞UI,java,android,multithreading,android-ndk,Java,Android,Multithreading,Android Ndk,我的UI线程被阻塞,而我正在加载静态C++库。 我想创建一个旋转加载条,这样用户就不会认为应用程序被冻结了。但我的酒吧没有旋转,因为这个图书馆加载它需要大约5秒钟。是否可以在静态块中加载库而不更新UI public class LoadingActivity extends AppCompatActivity { /** * Load native libraries */ static { System.loadLibrary("nat

我的UI线程被阻塞,而我正在加载静态C++库。 我想创建一个旋转加载条,这样用户就不会认为应用程序被冻结了。但我的酒吧没有旋转,因为这个图书馆加载它需要大约5秒钟。是否可以在静态块中加载库而不更新UI

public class LoadingActivity extends AppCompatActivity {


    /**
     * Load native libraries
     */

    static {
        System.loadLibrary("native-lib");
        if (BuildConfig.DEBUG) {
            OpenCVLoader.initDebug();
        }
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent returnIntent = new Intent();
        returnIntent.putExtra("result", Activity.RESULT_OK);
        setResult(Activity.RESULT_OK, returnIntent);
        finish();
    }
}
这应该做到:

static {
  new Thread(() -> {        
    System.loadLibrary("native-lib");
    if (BuildConfig.DEBUG) {
        OpenCVLoader.initDebug();
    }
  }).start();
}

但是,在使用库之前,您必须注意等待库被加载和初始化。

您应该在非主线程中加载本机库。这是一个很好且简单的修复方法。但即便如此,直接从活动中使用大量本机库也不是一个好主意。将本机库封装在一个单独的Java类中更安全,该类不是由Android lifecycle管理的。但老实说,我真的看不出使用单独的类如何改善运行时行为。你能解释一下吗?一个单独的类可以以更可控的方式加载。对于活动,这完全是系统的责任。你不知道Android什么时候会实例化它。特别是对于OP提供的示例,此LoadingActivity的唯一目的是加载本机库。巨大的内存、资源和维护开销是不合理的。在Android框架派生类应用程序、活动、片段等中避免使用本机方法的另一个好理由是允许使用Robolectric see等工具进行自动化测试。