// Returns whether the extensionless basename of `location` is equal to name. // E.g. check_name("/foo/bar/baz.odex", "baz") == true, // check_name("/foo/bar/baz.odex", "bar") == false staticbool check_name(const std::string& location, const std::string& name) {
std::string loc_name = location;
size_t idx = loc_name.rfind('/'); if (idx != std::string::npos) {
loc_name = loc_name.substr(idx + 1);
}
idx = loc_name.rfind('.'); if (idx != std::string::npos) {
loc_name = loc_name.substr(0, idx);
} return loc_name == name;
}
extern"C" JNIEXPORT jboolean JNICALL Java_Main_checkAppImageLoaded(JNIEnv* env,
jclass,
jstring jimage_name) {
ScopedUtfChars image_name(env, jimage_name);
ScopedObjectAccess soa(Thread::Current()); for (auto* space : Runtime::Current()->GetHeap()->GetContinuousSpaces()) { if (space->IsImageSpace()) { auto* image_space = space->AsImageSpace(); constauto& image_header = image_space->GetImageHeader(); // Check that this is an app image associated with the dex file named // `jname` by verifying the extensionless basename of the odex file // location is equal to `jname`. if (image_header.IsAppImage() &&
check_name(image_space->GetOatFile()->GetLocation(), image_name.c_str())) { return JNI_TRUE;
}
}
} return JNI_FALSE;
}
extern"C" JNIEXPORT jboolean JNICALL Java_Main_checkAppImageContains(JNIEnv*, jclass, jclass c) {
ScopedObjectAccess soa(Thread::Current());
ObjPtr<mirror::Class> klass_ptr = soa.Decode<mirror::Class>(c); for (auto* space : Runtime::Current()->GetHeap()->GetContinuousSpaces()) { if (space->IsImageSpace()) { auto* image_space = space->AsImageSpace(); constauto& image_header = image_space->GetImageHeader(); if (image_header.IsAppImage()) { if (image_space->HasAddress(klass_ptr.Ptr())) { return JNI_TRUE;
}
}
}
} return JNI_FALSE;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.