2

cpp クラスから Java の関数を呼び出してブール値をメモリに保存しようとすると、次のエラーが発生します。MyAdapter.cpp というクラスを使用して、関数を MyAdapterJni.cpp に呼び出しています。MyAdapterJni.cpp に次の関数を記述しました。

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-14 12:06:32.024: D/libMyManager(9575): GetBoolean の静的メソッド ID が見つかりませんでした

私のJavaクラスはパッケージcom.mygames.Game内にあります

誰でもこのエラーの原因を教えてください

4

3 に答える 3

1

の初期化はMyManagera をスローしますNullPointerException。これはおそらくメソッド ID の決定を妨げるため、それを確認することをお勧めします。クラス初期化子がこれをスローするだけでなく、静的フィールドの初期化もスローできることに注意してください。すべての初期化をクラス初期化子に入れ、そこからデバッグすることができますnull

于 2012-12-14T08:00:31.643 に答える
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);   
        }
    });

    }
}

注:関数のパラメーターを作成する際にエラーが発生する場合があります。ご理解いただけない場合は、お気軽にお問い合わせください...

于 2012-12-17T17:15:37.313 に答える
0

私もこの問題を抱えていました。私の場合、メイン UI スレッドで Java メソッド機能を実行すると、問題が解決しました。たとえば、Javaメソッド内

Activity ac=(Activity) context;
     ac.runOnUiThread(new Runnable() 
     {
         public void run() 
            {
                 //your code here
            }
     });
于 2014-12-18T12:18:34.693 に答える