0

そのため、NDK 呼び出し間で C++ クラスのインスタンスを保持しようとしています。つまり、以下の新しい NetPoco ポインターが機能しません。

シミュレーターではすべて正常に動作しますが、デバイスではエラー ループに陥っているようです。プログラムが jsonCreate から戻ったときに GC がポインター オブジェクトを破棄して、後で jsonParse で使用できないのではないかと疑っています。この問題を解決するにはどうすればよいですか?

(コードがデバイス上で動作していた後に変更されたのは、NetPoco のインスタンス化を解析から作成に移動したこと、つまり永続的なポインターを作成したことだけであることに注意してください。)

コードの下にエラー ループが表示されます。エラーの原因は次のようです。

for(int i = 0; i < ref->storeRefs.size();i++)

しかし、そうであるかどうかはわかりません.storeRefsはrefに保持されていないようです...

long jsonCreate(JNIEnv* aEnv, jobject aObj, jstring str){
    const char * natStr = aEnv->GetStringUTFChars(str,0);
    return (jlong)new NetPoco(natStr);
}


bool jsonParse(JNIEnv* aEnv, jobject aObj, jlong pointer){

    //JSON FROM NETWORK:
    StoreRefListComplexType *ref;
    int iterations = 1;
    for (int i = 0; i < iterations; i++) {

        ref = ((NetPoco*)pointer)->getStoreRefListComplexType();
        if (i < iterations - 1) delete ref;
    }
    //delete netHelper;

    //Callback to populate ArrayList in java:
    jclass cls = aEnv->FindClass("com/example/jsonpoco/MainActivity");
    jmethodID methodid = aEnv->GetMethodID(cls, "add", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DD)V");
    std::list<StoreRefComplexType>::iterator it = ref->storeRefs.begin();
    for(int i = 0; i < ref->storeRefs.size();i++){
        jstring storeNo = aEnv->NewStringUTF(it->getStoreNo().c_str());
        jstring storeName = aEnv->NewStringUTF(it->getStoreName().c_str());
        jstring storeUrl = aEnv->NewStringUTF(it->getStoreUrl().c_str());
        aEnv->CallVoidMethod(aObj,methodid, storeNo, storeName, storeUrl, it->getStoreLocation()->getLatitude(), it->getStoreLocation()->getLongitude());
        std::advance(it, 1);
    }
    //delete ref;
    return ((jboolean)((NetPoco*)pointer)->usingCached);
}

04-23 10:29:31.928: D/dalvikvm(21469): ライブラリをロードしようとしています /data/app-lib/com.example.jsonpoco-2/libJsonPoco.so 0x417a76b8

04-23 10:29:31.936: D/dalvikvm(21469): 共有ライブラリ /data/app-lib/com.example.jsonpoco-2/libJsonPoco.so 0x417a76b8 を追加

04-23 10:29:31.967: I/dalvikvm(21469): トレース開始: '/storage/emulated/legacy/jsonjavanc_profiling.trace' 8192KB

04-23 10:29:31.983: D/dalvikvm(21469): +++ アクティブなプロファイラー数が 1 になりました

04-23 10:29:32.404: A/libc(21469): 0x00000004 の致命的なシグナル 11 (SIGSEGV) (コード = 1)、スレッド 21469 (xample.jsonpoco)

04-23 10:29:33.803: D/dalvikvm(21497): lib /data/app-lib/com.example.jsonpoco-2/libJsonPoco.so 0x4179efd8 を読み込もうとしています

04-23 10:29:33.811: D/dalvikvm(21497): 共有ライブラリ /data/app-lib/com.example.jsonpoco-2/libJsonPoco.so 0x4179efd8 を追加

04-23 10:29:33.850: I/dalvikvm(21497): トレース開始: '/storage/emulated/legacy/jsonjavanc_profiling.trace' 8192KB

04-23 10:29:33.865: D/dalvikvm(21497): +++ アクティブなプロファイラー数が 1 になりました

04-23 10:29:34.295: A/libc(21497): 0x00000004 の致命的なシグナル 11 (SIGSEGV) (コード = 1)、スレッド 21497 (xample.jsonpoco)

04-23 10:29:34.779: D/dalvikvm(21512): lib /data/app-lib/com.example.jsonpoco-2/libJsonPoco.so 0x417a0668 を読み込もうとしています

04-23 10:29:34.779: D/dalvikvm(21512): 共有ライブラリ /data/app-lib/com.example.jsonpoco-2/libJsonPoco.so 0x417a0668 を追加しました

04-23 10:29:34.819: I/dalvikvm(21512): トレース開始: '/storage/emulated/legacy/jsonjavanc_profiling.trace' 8192KB

04-23 10:29:34.834: D/dalvikvm(21512): +++ アクティブなプロファイラー数が 1 になりました

04-23 10:29:35.264: A/libc(21512): 0x00000004 の致命的なシグナル 11 (SIGSEGV) (コード = 1)、スレッド 21512 (xample.jsonpoco)

そして NDK-STACK の結果:

Exjobbs-MacBook-Pro:android-ndk-r8d exjobb$ ./ndk-stack -sym /Users/exjobb/code/eclipse/NetPocoCache/libs/ -dump /Users/exjobb/log.txt * **クラッシュ ダンプ:** * ビルドフィンガープリント: 'google/yakju/maguro:4.2.2/JDQ39/573038:user/release-keys' pid: 8624, tid: 8624, name: xample.jsonpoco >>> com.example.jsonpoco << < シグナル 11 (SIGSEGV)、コード 1 (SEGV_MAPERR)、障害 addr 00000004 スタック フレーム #00 pc 00062ff8 /data/app-lib/com.example.jsonpoco-1/libJsonPoco.so (jsonParse+104) スタック フレーム #01 pc 00040da1 /system/lib/libdvm.so クラッシュダンプ完了

***クラッシュ ダンプ:** * ビルドフィンガープリント: 'google/yakju/maguro:4.2.2/JDQ39/573038:user/release-keys' pid: 8639, tid: 8639, name: xample.jsonpoco >>> com.example.jsonpoco << < シグナル 11 (SIGSEGV)、コード 1 (SEGV_MAPERR)、障害 addr 00000004 スタック フレーム #00 pc 00062ff8 /data/app-lib/com.example.jsonpoco-1/libJsonPoco.so (jsonParse+104) スタック フレーム #01 pc 00040da1 /system/lib/libdvm.so クラッシュダンプ完了

***クラッシュ ダンプ:** * ビルドフィンガープリント: 'google/yakju/maguro:4.2.2/JDQ39/573038:user/release-keys' pid: 8653, tid: 8653, name: xample.jsonpoco >>> com.example.jsonpoco << < シグナル 11 (SIGSEGV)、コード 1 (SEGV_MAPERR)、障害 addr 00000004 スタック フレーム #00 pc 00062ff8 /data/app-lib/com.example.jsonpoco-1/libJsonPoco.so (jsonParse+104) スタック フレーム #01 pc 00040da1 /system/lib/libdvm.so クラッシュダンプ完了

***クラッシュ ダンプ:** * ビルドフィンガープリント: 'google/yakju/maguro:4.2.2/JDQ39/573038:user/release-keys' pid: 8667, tid: 8667, name: xample.jsonpoco >>> com.example.jsonpoco << < シグナル 11 (SIGSEGV)、コード 1 (SEGV_MAPERR)、障害 addr 00000004 スタック フレーム #00 pc 00062ff8 /data/app-lib/com.example.jsonpoco-1/libJsonPoco.so (jsonParse+104) スタック フレーム #01 pc 00040da1 /system/lib/libdvm.so クラッシュダンプ完了

***クラッシュ ダンプ:** * ビルドフィンガープリント: 'google/yakju/maguro:4.2.2/JDQ39/573038:user/release-keys' pid: 8681, tid: 8681, name: xample.jsonpoco >>> com.example.jsonpoco << < シグナル 11 (SIGSEGV)、コード 1 (SEGV_MAPERR)、障害 addr 00000004 スタック フレーム #00 pc 00062ff8 /data/app-lib/com.example.jsonpoco-1/libJsonPoco.so (jsonParse+104) スタック フレーム #01 pc 00040da1 /system/lib/libdvm.so クラッシュダンプ完了

更新: コードを減らしてもクラッシュが発生するため、コードは単なるものに縮小されました:

bool jsonParse(JNIEnv* aEnv, jobject aObj, jlong pointer){

//JSON FROM NETWORK:
StoreRefListComplexType *ref;
ref = ((NetPoco*)pointer)->getStoreRefListComplexType();
jclass cls = aEnv->FindClass("com/example/jsonpoco/MainActivity");
jmethodID methodid = aEnv->GetMethodID(cls, "add", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DD)V");
std::list<StoreRefComplexType>::iterator it;// = ref->storeRefs.begin();
printf(ref->storeRefs.size());

クラッシュの原因は、wifi を使用するか 3g を使用するかに依存するようですが、3g は動作します。私が確かに知っているとき、さらなる更新が来るでしょう。あなたの答えは私のコードをより良くしました!!

4

0 に答える 0