Class* initialize(ClassMap * classMap) { Class * newClass = new Class(NULL); staticClassPtr = newClass; newClass->classLoader = NULL; newClass->parentClass = classMap->getClass("java/lang/Object"); newClass->fullyQualifiedName = Utf8String("java/lang/String"); newClass->addMethod(getNativeMethod("<init>", "()V", &init)); newClass->addMethod(getNativeMethod("toString", "()Ljava/lang/String;", &toString)); newClass->addMethod(getNativeMethod("clone", "()Ljava/lang/Object;", &clone)); newClass->addMethod(getNativeMethod("hashCode", "()I", &hashCode)); newClass->addMethod(getNativeMethod("length", "()I", &length)); return newClass; }
int main(int argc, char ** argv) { if (argc < 2) { std::cerr << "Driver must be called with the .class file to test" << std::endl; return 1; } auto cls = new Espresso::Blender::JVMClass(argv[1]); auto classdb = new Espresso::VM::ClassResolver(); classdb->addClass(new Espresso::VM::Class::DlOpen("java/lang/System")); classdb->addClass(cls); auto vmp = Espresso::Blender::VMMethodProvider(classdb); vmp.getNativeMethod(cls->name(), "test", "()V"); // use another method just to check if <clinit> is called return _called_code == 99 ? 0 : 2; }
Class* initialize(ClassMap* classMap) { if (staticClassPtr != NULL) { return staticClassPtr; } Class * objectClass = classMap->getClass("java/io/InputStream"); Class * aClass = new Class(0); aClass->parentClass = objectClass; aClass->classLoader = NULL; aClass->fullyQualifiedName = "java/io/FileInputStream"; aClass->addMethod(getNativeMethod("<init>", "(Ljava/lang/String;)V", &initFromString)); staticClassPtr = aClass; return aClass; }
int main(int argc, char ** argv) { if (argc != 2) { std::cerr << "Test must be called with the path to the test class" << std::endl; return 1; } Espresso::Log = _log; auto classdb = Espresso::VM::ClassResolver(); classdb.addClass(new Espresso::VM::Class::DlOpen("java/lang/Object")); auto cls = new Espresso::Blender::JVMClass(argv[1]); if (!*cls) { std::cerr << argv[1] << " wasn't loaded: " << cls->error() << std::endl; return 1; } classdb.addClass(cls); auto vmp = Espresso::Blender::VMMethodProvider(&classdb); int (*fn)(int, int) = (int (*)(int, int))vmp.getNativeMethod(cls->name(), "doSum", "(II)I"); if (!fn) { std::cerr << argv[1] << " does not contain sum(II)I" << std::endl; return 1; } if (fn(0, 0) != 0) { std::cerr << "sum(0, 0) - expected 0, returned " << fn(0, 0) << std::endl; return 1; } if (fn(1, 6) != 7) { std::cerr << "sum(1, 6) - expected 7, returned " << fn(1, 6) << std::endl; return 1; } if (fn(-1, 6) != 5) { std::cerr << "sum(-1, 6) - expected 5, returned " << fn(-1, 6) << std::endl; return 1; } return 0; }