这是我的计划:
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“)下方的行;”会导致崩溃! 我找不到原因。谁能帮我?谢谢!
答案 0 :(得分:0)
尝试修复以下行。它具有无效的签名,并且会导致为MethodNotFound异常抛出隐式异常,并且可能是罪魁祸首。
jmethodID mtdGetCrc = jniEnv->GetMethodID(clsZipEntry,"getCrc","()L");
应该是:
jmethodID mtdGetCrc = jniEnv->GetMethodID(clsZipEntry,"getCrc","()J");
但是我会提出第二个建议来检查所有FindClass和FindMethod调用的返回值,因为它们不仅返回NULL,而且每次失败时都会抛出异常。当JNI无法为您的jclass查找返回本地引用对象返回时,也会引发OutOfMemoryException。