0

所以我试图在我的 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 有效!当我确定时会进一步更新。您的回答使我的代码变得更好!

4

0 回答 0