我使用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"}
答案 0 :(得分:0)
我发现C.java中的androidPaymentFinished()实际上并没有返回void而是一个String(我之前发布错误描述的道歉)。因此,CPP部分的返回与Java部分的返回不同。这会导致内存泄漏并导致压榨。