franta-hg@55: #include franta-hg@55: #include franta-hg@55: #include franta-hg@55: #include franta-hg@55: franta-hg@55: #include franta-hg@55: franta-hg@55: using namespace std; franta-hg@55: franta-hg@55: /** franta-hg@55: * Spouští JVM z C++, volá statickou metodu ze standardní knihovny (System.currentTimeMillis()) a main() metodu programu SQL-DK franta-hg@55: * franta-hg@55: * @param argc franta-hg@55: * @param argv franta-hg@55: * @return franta-hg@55: */ franta-hg@55: int main(int argc, char** argv) { franta-hg@55: franta-hg@55: setlocale(LC_ALL, ""); franta-hg@55: franta-hg@55: JavaVM *jvm; franta-hg@55: JNIEnv *env; franta-hg@55: franta-hg@55: JavaVMOption options[1]; franta-hg@55: char * home = getenv("HOME"); franta-hg@55: franta-hg@55: string classPath; franta-hg@55: classPath.append("-Djava.class.path="); franta-hg@55: classPath.append(home); franta-hg@55: classPath.append("/projekty/SQL-DK/sql-dk/java/sql-dk/dist/sql-dk.jar"); franta-hg@55: classPath.append(":"); franta-hg@55: classPath.append(home); franta-hg@55: classPath.append("/projekty/SQL-DK/sql-dk/java/jdbc-loopback-driver/dist/jdbc-loopback-driver.jar"); franta-hg@55: franta-hg@55: wprintf(L"classPath: %s\n", classPath.c_str()); franta-hg@55: franta-hg@55: options[0].optionString = new char[classPath.length() + 1]; franta-hg@55: copy(classPath.begin(), classPath.end(), options[0].optionString); franta-hg@55: franta-hg@55: JavaVMInitArgs vm_args; franta-hg@55: vm_args.version = JNI_VERSION_1_8; franta-hg@55: vm_args.nOptions = 1; franta-hg@55: vm_args.options = options; franta-hg@55: vm_args.ignoreUnrecognized = false; franta-hg@55: franta-hg@55: JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args); franta-hg@55: franta-hg@55: string className = "java/lang/System"; franta-hg@55: franta-hg@55: jclass cls = env->FindClass(className.c_str()); franta-hg@55: if (cls) { franta-hg@55: string methodName = "currentTimeMillis"; franta-hg@55: jmethodID mid = env->GetStaticMethodID(cls, methodName.c_str(), "()J"); franta-hg@55: franta-hg@55: if (mid) { franta-hg@55: jlong time = env->CallStaticLongMethod(cls, mid); franta-hg@55: wprintf(L"Aktuální čas Javy: %d\n", time); franta-hg@55: franta-hg@55: } else { franta-hg@55: wprintf(L"Metoda nebyla nalezena: %s\n", methodName.c_str()); franta-hg@55: } franta-hg@55: } else { franta-hg@55: wprintf(L"Třída nebyla nalezena: %s\n", className.c_str()); franta-hg@55: } franta-hg@55: franta-hg@55: delete cls; // TODO: jak čistit? franta-hg@55: franta-hg@55: className = "info/globalcode/sql/dk/CLIStarter"; franta-hg@55: cls = env->FindClass(className.c_str()); franta-hg@55: if (cls) { franta-hg@55: string methodName = "main"; franta-hg@55: jmethodID mid = env->GetStaticMethodID(cls, methodName.c_str(), "([Ljava/lang/String;)V"); franta-hg@55: franta-hg@55: if (mid) { franta-hg@55: //jstring arg = env->NewStringUTF("--list-databases"); franta-hg@55: //jarray args = env->NewObjectArray(1, env->FindClass("java/lang/String"), arg); franta-hg@55: franta-hg@56: jobjectArray args = env->NewObjectArray(10, env->FindClass("java/lang/String"), NULL); franta-hg@56: int a = 0; franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("--db")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("loopback")); franta-hg@56: //env->SetObjectArrayElement(args, a++, env->NewStringUTF("--sql-in")); // vyžaduje (libovolná) data na standardním vstupu franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("--sql")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("…")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("--data")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("2")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("a")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("b")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("c")); franta-hg@56: env->SetObjectArrayElement(args, a++, env->NewStringUTF("d")); franta-hg@55: franta-hg@55: franta-hg@55: for (int i = 0; i < 10; i++) { franta-hg@55: env->CallStaticVoidMethod(cls, mid, args); franta-hg@55: // FIXME: nefuguje – JVM ukončí proces → vlákna/procesy franta-hg@55: } franta-hg@55: franta-hg@55: franta-hg@55: } else { franta-hg@55: wprintf(L"Metoda nebyla nalezena: %s\n", methodName.c_str()); franta-hg@55: } franta-hg@55: } else { franta-hg@55: wprintf(L"Třída nebyla nalezena: %s\n", className.c_str()); franta-hg@55: } franta-hg@55: franta-hg@55: jvm->DestroyJavaVM(); franta-hg@55: return 0; franta-hg@55: } franta-hg@55: