2016-08-03 25 views
0

quick-cocos2d-xでアプリをコーディングしました。 このアプリは過去18ヶ月でうまく機能します。 しかし、今日、未知のエラーが表示され、Googleで支払いを終了すると常に挫折します。クイックココスでJNIエラーが発生しました

クラッシュが発生する位置を特定しました。

xxx.java

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

機能は、CPPの一部を呼び出すためのネイティブの静的関数です。 CPPの一部をリンクするためにJNIを使​​用中に

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 DETECTED ERROR IN APPLICATION: use of invalid jobject 0x9bbbfe80 

上記のエラーログが表示され、プログラムが破損しました。

しかし、アプリケーションが決して前に挫折してコードが変更されたことは決してありません。そしてクラッシュが起こったとき、同じコードを持つ他のAPPは一度でも潰れませんでした。

誰もこの前にこの状況に遭遇しましたか?

追加

私は、Javaコードがネイティブ関数を呼び出そうとするとエラーが一度に発生すると思います。そしてCPPの部品が何であっても、プログラムは数秒後にはいつも挫折します。私はcppコードに注釈を付けてそれを空の関数にしましたが、プログラムはまだ粉砕されました。

入力が有効であると確信しています。私はC.androidPaymentFinished(data)が呼び出される前にログを出力し、データは有効なJSONスタイルの文字列です。

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

JNIエラーが発生する場所をより正確に知る必要があります。また、 'jstringToString'と' googlePayFinish'の実装はどうなりますか?今まで私たちに示してきたことから、すべての入力パラメータが常に有効であると仮定しているようですが、それは悪い考えです。 – Michael

答えて

0

私はC.javaでandroidPaymentFinished()は実際に空の文字列が、(前に間違った記述を投稿するための私の謝罪を)返さないことが分かりました。したがって、CPPの部分でのリターンは、Javaの部分でのリターンとは異なります。その結果、メモリリークが発生し、クラッシュすることになります。

関連する問題