2012-12-14 53 views
2

在嘗試從cpp類調用java中的函數以在存儲器中保存布爾值時出現以下錯誤。我使用一個名爲MyAdapter.cpp的類來調用MyAdapterJni.cpp函數。我有以下寫在MyAdapterJni.cpp使用JNI從cpp調用java方法時出現異常

bool GetBooleanJni(const char *key, bool defaultValue) 
{ 
    cocos2d::JniMethodInfo methodInfo; 
    jboolean ret = false; 
    if (! getStaticMethodInfo(methodInfo, "GetBoolean", "(Ljava/lang/String;Z)Z")) 
    { 
     return ret; 
    } 
    ret = methodInfo.env->CallStaticBooleanMethod(methodInfo.classID, methodInfo.methodID, defaultValue); 
    methodInfo.env->DeleteLocalRef(methodInfo.classID); 

    return ret; 
} 

功能,我已經在myManager.java類下面的函數

public static boolean GetBoolean(String key, boolean defaultValue) 
{ 
    return sharedPreferences.getBoolean(key, defaultValue); 
} 

我碰到下面的日誌我的logcat

12-14 12:06:32.024:W/dalvikvm(9575):異常Ljava/lang/NullPointerException;在初始化Lcom/mygames/Game/MyManager時拋出;

12月12日至14日:06:32.024:d/libMyManager(9575):未能找到GetBoolean的靜態方法ID

我的Java類是包com.mygames.Game內部

燦任何人請告訴我什麼可能會導致此錯誤

回答

1

初始化MyManager會拋出一個NullPointerException,這可能會阻止確定方法ID,所以你可能想看看。請注意,不僅類初始化器可能會拋出此錯誤,還會初始化任何靜態字段。您可以將所有初始化放入類初始化程序,然後從那裏調試,必須有null

+0

@Glinda NullPointerException來自Java端。我的猜測是,在收到methodId之前,內部會運行java類初始化程序和靜態字段初始值設定項,並且其中一個拋出錯誤。 – Botz3000

+0

我該如何確定究竟從java類拋出錯誤 – glo

+0

@Glinda您可以將所有初始化放在類初始化程序中,並檢查錯誤,即在使用它們之前檢查所有變量爲null,捕獲異常並打印堆棧跟蹤,或者將你的java調試器附加到進程中(不知道如何做到這一點)。 – Botz3000

0

試圖讓在其中運行這個(說cocos2dxActivity)活動的實例,並做runonUiThread實施....

public static boolean GetBoolean(String key, boolean defaultValue) { 
Cocos2dxActivity.getInstance().runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
       return sharedPreferences.getBoolean(key, defaultValue); 
     } 
    }); 

    } 
} 

注:它可能給你做的一些錯誤功能參數。希望你明白,如果不請請隨時問...

0

我也有這個問題,並在我的情況下,在主UI線程上運行我的Java方法功能解決了我的問題。例如在你的java方法裏面

Activity ac=(Activity) context; 
    ac.runOnUiThread(new Runnable() 
    { 
     public void run() 
      { 
       //your code here 
      } 
    }); 
相關問題