android - 如何解决NDK库调用卡住UI线程的问题

标签 android multithreading android-ndk

我有一个通过 NDK 访问的 C 库。某些操作非常耗时,因此 UI 线程在执行这些操作时会卡住。正如我现在的常见做法是那样使用 Runnable:

myFixedThreadPool.execute(new Runnable() 
{
  public void run() 
  {
    NativeClass.callToNDKLibrary();
  };
});

或类似的主题:

Thread t = new Thread() 
{
  public void run() 
  {
    NativeClass.callToNDKLibrary();
  }
};
t.start();  

但问题是 C 库不是线程安全的:当我这样包装它时它开始崩溃。所以问题是如何从仍然强制 NDK 调用一次运行一个的 UI 线程分离。同步的一些技巧可能会有所帮助吗?我还想提一下,这个库是我的应用程序的核心底层,而不仅仅是一个辅助函数。所以我的代码的几乎每个部分都会调用它。并且只有少数函数会消耗时间,大多数会很快将它们保留在主线程中。

最佳答案

最终的解决方案如下:

  1. 将所有 JNI native 方法定义为同步的。这将防止 C 库崩溃,但仍会卡住 UI。
  2. 定义单线程执行器:

    ExecutorService mExecutorThread = Executors.newSingleThreadExecutor();

  3. 在该线程中包装所有耗时的操作:

    mExecutorThread.execute(new Runnable() { 公共(public)无效运行() { NativeClass.callToNDKLibrary(); } });

我必须做的最后一件事是稍微重新设计我的代码,以确保不会从 onDraw() 调用任何 native 方法。我将本地方法的结果缓存在事件处理程序中,并在 onDraw() 中使用缓存的值。

关于android - 如何解决NDK库调用卡住UI线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4076101/

相关文章:

java - Messenger应用的流或数据报套接字

java - 如何在进入后台时完成应用程序

multithreading - 与超时并行运行循环

multithreading - Oracle sqlldr是否并行处理多个INFILE

android-ndk - 如何使用 eclipse 安装和构建 NDK?

退出时Android有时会崩溃

android - 更新选定 RecyclerView 行中的 TextView

android - 如何在使用 Rx 开始第二个请求之前等待第一个请求完成?

android - 检查工作 AsyncTask

android - 为android平台编译NITE2