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