如何从Java进行同步异步本机调用



我正在为Android开发一款国际象棋游戏,并计划使用用C++编写的AI引擎。因此,我必须从Java到C++进行本机方法调用。来源如下:

计算机.java

class Computer{
  public native String dumpMethod();
  static{
   System.loadLibrary("mylib");
}
public static String makeMove(){
   return dumpMethod();
}

和c++文件:mylib.cpp

#include <jni.h>
#include <string>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_Computer_dumpMethod(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_Computer_dumpMethod(JNIEnv *env, jobject obj){
  ...
  Engine * engine = new Engine();
  engine->setLevel(10);
  std::string rsult = engine->generateMove();
  ...
  //return result
  ...
}
#ifdef __cplusplus
}
#endif

当我从主活动中调用Computer.makeMove()时,程序崩溃了,logcat窗口中没有任何错误信息。我不知道这个问题,但似乎是因为generateMove()的执行。

当级别设置为10时,generateMove()调用需要很长时间(最多15秒)才能完成。我认为安卓系统的活动只是迫不及待地等到它结束,它已经崩溃了。

如果级别设置为1,则Everthing运行良好,这意味着generateMove()可以完成并立即返回执行结果。

我想我需要以同步的方式打电话,但我对此一无所知。有没有任何方法可以以同步/异步的方式进行本机调用?

我猜您正在从主线程调用JNI Native方法:dumpMethod,在执行本机代码期间阻塞主线程。因此,当你提高到10级时,它所花费的时间超过了1级时的几毫秒/秒,你得到了ANR-应用程序未响应异常。

尝试生成一个新线程并从后台线程调用本机方法,然后当您想要更新UI时,向主线程消息队列发送一条消息。

最新更新