Java 在JNI代码中阻止对话框

Java 在JNI代码中阻止对话框,java,android,java-native-interface,android-ndk,Java,Android,Java Native Interface,Android Ndk,我正在编写一个应用程序,它基本上是一个围绕250K JNI的包装器。JNI(一个游戏引擎)有像handle_penUp(intx,inty)这样的API。有时它需要从handle_penUp()内部查询用户(通过回调到Java代码),因此我用来实现查询的对话框必须被阻塞 我知道执行的主线程无法阻止。因此,我产生了第二个线程,它进行所有可能导致需要阻塞的回调的JNI调用。在第二个线程中,当我需要建立一个阻塞对话框时,我调用startActivityForResult(),然后在信号量上调用acqu

我正在编写一个应用程序,它基本上是一个围绕250K JNI的包装器。JNI(一个游戏引擎)有像handle_penUp(intx,inty)这样的API。有时它需要从handle_penUp()内部查询用户(通过回调到Java代码),因此我用来实现查询的对话框必须被阻塞

我知道执行的主线程无法阻止。因此,我产生了第二个线程,它进行所有可能导致需要阻塞的回调的JNI调用。在第二个线程中,当我需要建立一个阻塞对话框时,我调用startActivityForResult(),然后在信号量上调用acquire()。在主线程上调用onActivityResult()时,它会在同一信号量上调用release()


如果我的查询是作为新活动实现的,则此选项有效,但如果我希望在现有活动中显示Dialog(),则此选项无效。日志消息告诉我我的线程需要一个活套。我正在添加一个——并将附加关于它是否有效的信息——但感觉好像我走错了路。我需要的是一个阻塞对话框的方法(如果只是因为其他平台都有这样的对话框,所以移植的代码通常是这样工作的话,那么这很有用。)

您肯定不需要两个UI线程。就控制流和显示而言,应该只有一个线程与Android SDK通信(即与绘图、启动活动、显示对话框等相关的任何内容)

另外,请记住,您并不希望实际保持线程运行—所有内容都基于事件,因此您希望代码响应某些内容,执行某些操作,然后尽快退出


当你说“block”时,你到底是什么意思?需要阻止什么?如果您只需要停止响应事件,为什么不在对话框可见时将布尔值设置为true,并在对话框为true时忽略所有事件?

这听起来很像我在通过触摸线程设置可见/不可见某些视图时遇到的问题

问题是,您不能从另一个线程(这是您的情况)在GUI上执行某些操作

您需要做的是在主线程中使用句柄 我在活动中宣布了这一点

public static final Handler handlerVisibility = new Handler() {
    public void handleMessage(Message msg) {
        int visibility = msg.getData().getInt("visibility");
        view.setVisibility(visibility);
    }
};
我选择了publicstatic选项,这样我就可以在任何地方访问(因为我每次调用的次数都不会超过一次,而且我懒得将它传递给子类)

然后,您要做的是向该处理程序发送一条消息,因为该处理程序与gui位于同一线程中,所以它可以工作^^

Message msg = MainActivity.handlerVisibility.obtainMessage();
    Bundle b = new Bundle();
            b.putInt("visibility", View.VISIBLE);
    msg.setData(b);
            MainActivity.handlerVisibility.sendMessage(msg);
这将解决您的循环器错误,并允许您将GUI请求从一个线程发送到另一个线程

希望能有帮助


Jason

可能在阻塞与非阻塞io中阻塞(调用在获得请求的输入或失败之前不会返回,而不是立即返回并报告缓冲区中已存在的任何输入)