快速cocos

时间:2016-08-03 08:06:20

标签: java android c++ java-native-interface

我使用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

上面的错误日志显示出来,程序被粉碎了。

但奇怪的是,该应用程序从未粉碎过,代码永远不会改变。当粉碎发生时,其他具有相同代码的APP甚至没有粉碎过一次。

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

其他

我认为错误发生在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"}

1 个答案:

答案 0 :(得分:0)

我发现C.java中的androidPaymentFinished()实际上并没有返回void而是一个String(我之前发布错误描述的道歉)。因此,CPP部分的返回与Java部分的返回不同。这会导致内存泄漏并导致压榨。