そのため、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 は動作します。私が確かに知っているとき、さらなる更新が来るでしょう。あなたの答えは私のコードをより良くしました!!