2

我正在为 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 秒)才能完成。我认为 Android 活动不能等到它完成并崩溃。

如果 level 设置为 1,则一切正常,这意味着 generateMove() 可以完成并立即返回执行结果。

我想我需要以同步方式拨打电话,但我不知道。有没有办法以同步/异步方式进行本机调用?

4

1 回答 1

0

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

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

于 2014-12-30T17:23:18.463 回答