我正在为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时,向主线程消息队列发送一条消息。