[英]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.