所以我试图在我的 NDK 调用之间保留一个 C++ 类的实例,即下面的新 NetPoco 指针不起作用。
在模拟器中一切正常,但在设备上似乎陷入错误循环。我怀疑当程序从 jsonCreate 返回时,GC 会丢弃我的指针对象,因此以后无法在 jsonParse 中使用它,我该如何解决这个问题?
(请注意,自从代码在设备上运行以来,唯一改变的是:将 NetPoco 的实例化从 parse 移动到 create,即创建一个持久指针。)
错误循环显示在代码下方,错误似乎来自:
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): 试图加载 lib /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): TRACE STARTED: '/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): 致命信号 11 (SIGSEGV) 在 0x00000004 (code=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): TRACE STARTED: '/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): 致命信号 11 (SIGSEGV) 在 0x00000004 (code=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): TRACE STARTED: '/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): 致命信号 11 (SIGSEGV) 在 0x00000004 (code=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),故障地址 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),故障地址 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),故障地址 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),故障地址 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),故障地址 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 有效!当我确定时会进一步更新。您的回答使我的代码变得更好!