如何修复env-> NewObject()的JNI崩溃?

时间:2014-12-22 02:06:10

标签: android crash java-native-interface zipfile

这是我的计划:

extern "C" {        
 JNIEXPORT jint Java_android_app_integrity_VerifyIntegrity_checkCrc(JNIEnv *jniEnv,jobject thiz,jstring crcStr) {

    jclass clsZipFile = jniEnv->FindClass("java/util/zip/ZipFile");
    jmethodID mtdConstruct = jniEnv->GetMethodID(clsZipFile, "<init>", "(Ljava/lang/String;)V");
    jmethodID mtdGetEntry = jniEnv->GetMethodID(clsZipFile,"getEntry","(Ljava/lang/String;)Ljava/util/zip/ZipEntry;");
    jclass clsZipEntry = jniEnv->FindClass("java/util/zip/ZipEntry");
    jmethodID mtdGetCrc = jniEnv->GetMethodID(clsZipEntry,"getCrc","()L");
    LOGD("pos2");

    jobject objZipFile = jniEnv->NewObject(clsZipFile,mtdConstruct,crcStr);
    if (NULL == objZipFile){
        LOGD("NULL == objZipFile");
    }

    LOGD("pos3");
    jobject objZipEntry = jniEnv->CallObjectMethod(objZipFile, mtdGetEntry,"classes.dex");
    LOGD("pos4");
    jlong ret = jniEnv->CallLongMethod(objZipEntry, mtdGetCrc);

    LOGD("%ld",(long int)ret);
    return 0;
}
};

只打印“pos2”。 “LOGD(”pos2“)下方的行;”会导致崩溃! 我找不到原因。谁能帮我?谢谢!

1 个答案:

答案 0 :(得分:0)

尝试修复以下行。它具有无效的签名,并且会导致为MethodNotFound异常抛出隐式异常,并且可能是罪魁祸首。

jmethodID mtdGetCrc = jniEnv->GetMethodID(clsZipEntry,"getCrc","()L");

应该是:

jmethodID mtdGetCrc = jniEnv->GetMethodID(clsZipEntry,"getCrc","()J");

但是我会提出第二个建议来检查所有FindClass和FindMethod调用的返回值,因为它们不仅返回NULL,而且每次失败时都会抛出异常。当JNI无法为您的jclass查找返回本地引用对象返回时,也会引发OutOfMemoryException。