android - native 调用会阻塞主线程

标签 android multithreading java-native-interface

我有一些 Android 应用程序应该在启动时加载一些数据并尽快处理它。为了在 native 代码中完成更好的性能数据处理。 但有时数据量增加,处理时会阻塞 UI。奇怪的是,我从后台线程启动 JNI 调用,并且我相信 native 代码也应该在后台工作。 那么几个问题:

  1. 如何检测 native 代码是否在主线程中运行?
  2. 如何检测谁阻止了 UI?

一些代码示例:

        // java
        new Thread(new Runnable() {
            @Override
            public void run() {
              ResourceLoader.loadListsAndParse(); // native call
            }
        }).start();


// c++
void RulesManager::loadRules() {
   if (!rules_loaded_) {
        using namespace std;
        base::FilePath my_dir;
        GetCacheDirectory(&my_dir);
        this->loadRulesInternal(my_dir, true);
   }
}

void RulesManager::loadRulesInternal(base::FilePath& path, bool processExceptions) {
   base::FileEnumerator files(path, false, base::FileEnumerator::FILES);
   for (base::FilePath name = files.Next(); !name.empty(); name = files.Next()) {
        this->loadRulesFromFile(name.AsUTF8Unsafe(), processExceptions);
   }
}

bool RulesManager::loadRulesFromFile(const std::string& filePath, bool processException) {
    bool result = false;
    std::ifstream file(filePath);
    std::string str;
    while (std::getline(file, str)) {
        result = this->addRule(str, processException);
    }
    return result;
}

最佳答案

Android 在 中定义了系统调用 getpid()gettid()。如果 pid_t 返回值相等,则您的 native 代码在 UI 线程上运行。

关于android - native 调用会阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48023622/

相关文章:

multithreading - Julia中的最大线程数

java - JVM上的 "Magic"方法是否都标记为Native?

java - RxJava : How to handle events in multiple threads

c# - 检查窗口是否在另一个线程上打开的辅助方法

android - 调用移植库的本地函数

Java JNI - 是否可以从 C++ 在 Java 中设置单个原始数组元素

android - 在Android Studio中,如何使用GridView显示一个矩阵的Text Boxes?

android - build.gradle 文件中的 compileKotlin block 抛出错误 "Could not find method compileKotlin() for arguments [...]"

android - CameraX - 查找 Android 设备的焦距

android - 找出谁将 READ_PHONE_STATE 添加到我的 list 文件中?