繁体   English   中英

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

[英]How to make a synchronous\asynchronous native call from Java

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

Computer.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活动只能等到完成并崩溃为止。

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

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

我猜您正在从主线程中调用JNI本机方法:dumpMethod,在执行本机代码期间阻塞主线程。 因此,当您将级别提高到10级时,花费的时间超过了1级时所花费的几毫秒/秒,并且您遇到了ANR-Application Not Responding异常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM