2014-09-19 127 views
1

我正在開發面向Android的國際象棋遊戲,並計劃使用用C++編寫的AI引擎。 所以,我必須從Java到C++進行本地方法調用。消息來源是這樣的:如何從Java進行同步異步本機調用

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()並立即返回執行結果。

我想我需要以同步方式撥打電話,但我對此不知情。 有沒有辦法以同步/異步方式進行本地調用?

+0

我看到了同樣的問題發佈在這裏:http://stackoverflow.com/questions/11729822/android-jni-native-c-function-call-kills-activity。 – huynq9 2014-09-19 07:26:14

回答

0

我猜你正在調用JNI本地方法:主線程中的dumpMethod, 在執行本機代碼期間阻塞主線程。 所以當你增加到10級時,它比1級花費的毫秒數/秒多,並且你得到了ANR - 應用程序不響應例外。

嘗試產生一個新線程並從後臺線程調用本地方法,然後當您想要更新您的UI時,將消息發送到主線程消息隊列。