如何从Java进行同步\异步本机调用 我正在为Android开发一款象棋游戏,并且计划使用一个用C++编写的人工智能引擎。 所以,我必须从爪哇到C++调用本地方法。来源如下:

如何从Java进行同步\异步本机调用 我正在为Android开发一款象棋游戏,并且计划使用一个用C++编写的人工智能引擎。 所以,我必须从爪哇到C++调用本地方法。来源如下:,java,android,java-native-interface,synchronous,jniwrapper,Java,Android,Java Native Interface,Synchronous,Jniwrapper,Computer.java class Computer{ public native String dumpMethod(); static{ System.loadLibrary("mylib"); } public static String makeMove(){ return dumpMethod(); } 和C++文件:MyLII. CPP #include <jni.h> #include <string> #ifdef __cp

Computer.java

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

public static String makeMove(){
   return dumpMethod();
}

和C++文件:MyLII. 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的活动已经迫不及待地要等到它完成并崩溃了

如果级别设置为1,则所有操作都可以正常工作,这意味着generateMove可以完成并立即返回执行结果

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

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


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

我在此处看到了相同的问题:。