【发布时间】:2014-12-22 02:06:10
【问题描述】:
这是我的程序:
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");" 下面的行会导致崩溃! 我找不到原因。谁能帮我?谢谢!
【问题讨论】:
-
只是好奇——你为什么要这样做?您将一个 java 字符串向下传递给 C,然后仅使用它来创建一个 java 对象——只需在 java 端执行此操作并传递 jobject 以避免一些 JNI 痛苦。事实上,根本没有充分的理由在 C 中完成任何这些工作。你甚至不会得到速度提升。
-
您需要更多的错误检查。您调用的每个 JNI API 都可能静默失败。显然,类查找或构造函数查找失败。你为什么要在 JNI 中编码呢?就是一行 Java 代码。
标签: android crash java-native-interface zipfile