簡體   English   中英

JNI在應用程序中檢測到錯誤:使用已刪除的本地引用0x1

[英]JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x1

我有Java函數,該聲明如下所示:

public static void mathSendResults(final int kidId, final int points, final int correct, final int error, final float time,
                                       final String date, final long timestamp, final String description,
                                       final String settings, final int classNumber, final int level, final float percentage)

現在,我想通過JNI調用此函數:

void NativeHelper::mathSendResults(int kidId, int points, int correct, int error, float time,
                            std::string date, long timestamp, std::string description,
                            std::string settings, int classNumber, int level, float percentage) {

    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "mathSendResults",
                                                "(IIIIFLjava/lang/String;JLjava/lang/String;Ljava/lang/String;IIF)V")){

        jstring jdate = t.env->NewStringUTF(date.c_str());
        jstring jdescription = t.env->NewStringUTF(description.c_str());
        jstring jsettings = t.env->NewStringUTF(settings.c_str());

        t.env->CallStaticVoidMethod(t.classID, t.methodID, kidId, points, correct, error, time,
                                    jdate, timestamp, jdescription,
                                    jsettings, classNumber, level, percentage);

        t.env->DeleteLocalRef(t.classID);
        t.env->DeleteLocalRef(jdate);
        t.env->DeleteLocalRef(jdescription);
        t.env->DeleteLocalRef(jsettings);
    }
}

它應該可以工作,但是應用程序崩潰並顯示以下錯誤:

JNI DETECTED ERROR IN APPLICATION: use of deleted local reference 0x1

這對我來說很奇怪。 我嘗試刪除DeleteLocalRef調用,但仍然崩潰。 我已經在使用其他方法,但是參數較少。 我不確定這是否是原因。 無論如何,我都嘗試用int替換字符串(僅用於測試),因此參數的數量沒有變化並且有效。 因此,這絕對是字符串對象的問題。 我也嘗試發送空字符串,但結果是相同的(因此與字符串內容無關)。 我還嘗試將字符串數減少為一個,但是仍然崩潰。

一個jmethodid不是一個jobject ,並不需要(也不能)被刪除。

經過反復試驗和錯誤,我終於將其修復。

我不知道為什么,但是當jstrings是第一個參數時,它可以工作。 如果我在任何字符串應用程序崩潰前放了一些東西(如int)。 下面的代碼是解決方案:

void NativeHelper::mathSendResults(int kidId, int points, int correct, int error, float time,
                            std::string date, long timestamp, std::string description,
                            std::string settings, int classNumber, int level, float percentage) {

//    final String date, final String description, final String settings,
//    final int kidId, final int points, final int correct, final int error, final int classNumber, final int level,
//    final float percentage, final float time,
//    final long timestamp

    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "mathSendResults",
                                                "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIIIFFJ)V")){

        jstring jdate = t.env->NewStringUTF(date.c_str());
        jstring jdescription = t.env->NewStringUTF(description.c_str());
        jstring jsettings = t.env->NewStringUTF(settings.c_str());

        t.env->CallStaticVoidMethod(t.classID, t.methodID,
                                    jdate, jdescription, jsettings,
                                    kidId, points, correct, error, classNumber, level,
                                    percentage, time,
                                    timestamp);

        t.env->DeleteLocalRef(t.classID);
        t.env->DeleteLocalRef(jdate);
        t.env->DeleteLocalRef(jdescription);
        t.env->DeleteLocalRef(jsettings);
    }
}

Java:

public static void mathSendResults(final String date, final String description, final String settings,
                                   final int kidId, final int points, final int correct, final int error, final int classNumber, final int level,
                                   final float percentage, final float time,
                                   final long timestamp)

對於訂單為何重要,這仍然是我的一個謎。

編輯:更新了代碼。 實際上,第一個版本無法正常運行。 一些int變量在Java代碼中具有不正確的(隨機)值。 我必須通過類型對參數進行排序,然后終於可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM