一个JNI错误出现在quick cocos中

A JNI error met in quick-cocos

本文关键字:quick cocos JNI 错误 一个      更新时间:2023-10-16

我用quick-cocos2d-x编写了一个应用程序。该应用程序在过去18个月运行良好。但今天,一个未知的错误出现了,它总是在谷歌上完成付款时崩溃。

我找到了挤压发生的位置。

xxx.java

myApp.this.runOnGLThread(new Runnable() {
    @Override
    public void run() { 
        Log.d(TAG, obj.toString());
        C.androidPaymentFinished(obj.toString());
    }
});

该函数是一个本地静态函数,用于调用CPP部分。

C.java

class C{
    public static String void androidPaymentFinished(String data);
    // other functions
}

main.cpp

void Java_com_company_util_C_androidPaymentFinished(JNIEnv* env, jobject thiz, jstring data) {
    const char* str1 = jstringTostring2(data);
    PlatformAPI::googlePayFinish(str1);
}

在使用JNI链接CPP部件期间。

JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0x9bbbfe80

上面的错误日志显示出来,程序崩溃了。

但奇怪的是,该应用程序以前从未崩溃,代码也从未更改。当崩溃发生时,其他代码相同的应用程序甚至一次都没有崩溃。

以前有人遇到过这种情况吗?

附加

我认为错误发生在java代码试图调用本机函数的时候。无论CPP部分做什么,程序总是在几秒钟后崩溃。我对cpp代码进行了注释,并使其成为一个空白函数,但程序仍然崩溃了。

我确信输入是有效的。在调用C.androidPaymentFinished(data)之前,我输出了一个日志,并且data是一个有效的JSON样式String。

{"status":"ok","newCredits":222839450,"newGems":10,"newTickets":600,"stopIndex":5,"reward":100000,"sku":"com.company.app.item.000001"}

我发现C.java中的androidPaymentFinished()实际上不返回void,而是返回String(我为之前发布了错误的描述而道歉)。所以CPP部分的返回与Java部分的返回不同。这会导致内存泄漏并导致崩溃。