从JNI呼叫时不显示对话框

时间:2011-02-22 15:58:18

标签: android java-native-interface

我有一个原生的C函数(当然是 JNI )应该回调一个java方法来显示一个对话框,但是这个对话框永远不会显示。

这是如何工作的:

  1. C代码调用java方法
  2. java方法记录了一些东西
  3. 然后调用showDialog(SOME_ID)
  4. onCreateDialog(SOME_ID)被称为
  5. 使用AlertDialog.Builder
  6. 构建对话框
  7. 当我拨打AlertDialog alert = builder.create()时,应用程序就在那里停止(没有崩溃或冻结),但是当从C代码开始此调用时
  8. 代码如下:

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case SOME_ID:
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Message");
            builder.setPositiveButton(...);
            builder.setNegativeButton(...);
    
            AlertDialog alert = builder.create();
            System.out.println("...Never called from JNI");
            return alert;
        }
        return null;
    }
    

    6 中,我的意思是我在调用builder.create()之后在之前记录了一些内容,但在<{strong>之后<{strong>} {{1}永远不会调用方法,因此方法永远不会返回,并且永远不会创建对话框。我有一个按钮来触发对话框,正如预期的那样,它可以工作。

    我做了另一个测试,我打印create直接从getApplicationContext()onCreate()(从C代码调用)调用它是相同的,因为我认为的第一件事是从另一个Context或其他东西调用onCreateDialog()。

    你知道对话框没有显示的原因吗?

1 个答案:

答案 0 :(得分:1)

问题是当从JNI回调时,应用程序不在UI线程上,因此对话框从未显示过。为了解决这个问题,我使用了Handler(在Activity上):

public final Handler dialogHandler = new Handler(){     
    public void handleMessage(Message msg){
        showDialog(SOME_ID);
    }   
};

因此,我不是直接致电showDialog()而是致电dialogHandler.sendMessage()