我正在编写一个基本上是 250K JNI 包装器的应用程序。JNI(一个游戏引擎)有一些 API,比如 handle_penUp(int x, int y)。有时它需要从 handle_penUp() 内部查询用户(通过回调到 Java 代码),所以我用来实现查询的对话框必须阻塞。
我知道执行的主线程不能阻塞。因此,我生成了第二个线程,该线程进行所有可能导致需要阻塞的回调的 JNI 调用。在第二个线程中,当我需要建立一个阻塞对话框时,我调用 startActivityForResult(),然后在信号量上调用 acquire()。当 onActivityResult() 在主线程上被调用时,它会在同一个信号量上调用 release()。
如果我的查询是作为一个新的 Activity 实现的,则此方法有效,但如果我想在现有 Activity 中显示对话框()则不行。日志消息告诉我我的线程需要一个 Looper。我正在添加一个 - 并将附加有关它是否有效的信息 - 但感觉好像我在这里走错了路。我需要的是一个做阻塞对话框的秘诀(如果只是因为每个其他平台都有它们,所以移植的代码通常会以这种方式工作,这很有用。)