【问题标题】:Dialog not displaying when calling from JNI从 JNI 调用时不显示对话框
【发布时间】:2011-02-22 15:58:18
【问题描述】:

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

这就是它的工作原理:

  1. C 代码调用 java 方法
  2. java 方法记录一些东西
  3. 然后它调用showDialog(SOME_ID)
  4. onCreateDialog(SOME_ID) 被调用
  5. 对话框是使用AlertDialog.Builder 构造的
  6. 当我调用 AlertDialog alert = builder.create() 时,应用程序会停在那里(没有崩溃或冻结),但当此调用从 C 代码开始时。

代码如下:

@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() 之后 之前记录了一些东西,但是create 方法之后的日志之后 永远不会调用,因此该方法永远不会返回,并且永远不会创建对话框。我有一个按钮来触发对话框,并且正如预期的那样,它可以工作。

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

你知道为什么对话框没有显示吗?

【问题讨论】:

    标签: android java-native-interface


    【解决方案1】:

    问题在于,当从 JNI 回调时,应用程序不在 UI 线程上,因此从未显示对话框。为了修复它,我使用了一个处理程序(在 Activity 上):

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

    所以不是直接调用showDialog(),而是调用dialogHandler.sendMessage()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多