c++/jvm-jni-starter/jvm-jni-starter.cpp
changeset 55 2fbf53cf0782
child 56 813b44590d07
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/c++/jvm-jni-starter/jvm-jni-starter.cpp	Sat Jan 20 21:44:45 2018 +0100
     1.3 @@ -0,0 +1,106 @@
     1.4 +#include <cstdlib>
     1.5 +#include <wchar.h>
     1.6 +#include <locale.h>
     1.7 +#include <string>
     1.8 +
     1.9 +#include <jni.h>
    1.10 +
    1.11 +using namespace std;
    1.12 +
    1.13 +/**
    1.14 + * Spouští JVM z C++, volá statickou metodu ze standardní knihovny (System.currentTimeMillis()) a main() metodu programu SQL-DK
    1.15 + * 
    1.16 + * @param argc
    1.17 + * @param argv
    1.18 + * @return 
    1.19 + */
    1.20 +int main(int argc, char** argv) {
    1.21 +
    1.22 +	setlocale(LC_ALL, "");
    1.23 +
    1.24 +	JavaVM *jvm;
    1.25 +	JNIEnv *env;
    1.26 +
    1.27 +	JavaVMOption options[1];
    1.28 +	char * home = getenv("HOME");
    1.29 +
    1.30 +	string classPath;
    1.31 +	classPath.append("-Djava.class.path=");
    1.32 +	classPath.append(home);
    1.33 +	classPath.append("/projekty/SQL-DK/sql-dk/java/sql-dk/dist/sql-dk.jar");
    1.34 +	classPath.append(":");
    1.35 +	classPath.append(home);
    1.36 +	classPath.append("/projekty/SQL-DK/sql-dk/java/jdbc-loopback-driver/dist/jdbc-loopback-driver.jar");
    1.37 +
    1.38 +	wprintf(L"classPath: %s\n", classPath.c_str());
    1.39 +
    1.40 +	options[0].optionString = new char[classPath.length() + 1];
    1.41 +	copy(classPath.begin(), classPath.end(), options[0].optionString);
    1.42 +
    1.43 +	JavaVMInitArgs vm_args;
    1.44 +	vm_args.version = JNI_VERSION_1_8;
    1.45 +	vm_args.nOptions = 1;
    1.46 +	vm_args.options = options;
    1.47 +	vm_args.ignoreUnrecognized = false;
    1.48 +
    1.49 +	JNI_CreateJavaVM(&jvm, (void**) &env, &vm_args);
    1.50 +
    1.51 +	string className = "java/lang/System";
    1.52 +
    1.53 +	jclass cls = env->FindClass(className.c_str());
    1.54 +	if (cls) {
    1.55 +		string methodName = "currentTimeMillis";
    1.56 +		jmethodID mid = env->GetStaticMethodID(cls, methodName.c_str(), "()J");
    1.57 +
    1.58 +		if (mid) {
    1.59 +			jlong time = env->CallStaticLongMethod(cls, mid);
    1.60 +			wprintf(L"Aktuální čas Javy: %d\n", time);
    1.61 +
    1.62 +		} else {
    1.63 +			wprintf(L"Metoda nebyla nalezena: %s\n", methodName.c_str());
    1.64 +		}
    1.65 +	} else {
    1.66 +		wprintf(L"Třída nebyla nalezena: %s\n", className.c_str());
    1.67 +	}
    1.68 +
    1.69 +	delete cls; // TODO: jak čistit?
    1.70 +
    1.71 +	className = "info/globalcode/sql/dk/CLIStarter";
    1.72 +	cls = env->FindClass(className.c_str());
    1.73 +	if (cls) {
    1.74 +		string methodName = "main";
    1.75 +		jmethodID mid = env->GetStaticMethodID(cls, methodName.c_str(), "([Ljava/lang/String;)V");
    1.76 +
    1.77 +		if (mid) {
    1.78 +			//jstring arg = env->NewStringUTF("--list-databases");
    1.79 +			//jarray args = env->NewObjectArray(1, env->FindClass("java/lang/String"), arg);
    1.80 +
    1.81 +			jobjectArray args = env->NewObjectArray(9, env->FindClass("java/lang/String"), NULL);
    1.82 +			env->SetObjectArrayElement(args, 0, env->NewStringUTF("--db"));
    1.83 +			env->SetObjectArrayElement(args, 1, env->NewStringUTF("loopback"));
    1.84 +			env->SetObjectArrayElement(args, 2, env->NewStringUTF("--sql-in")); // vyžaduje (libovolná) data na standardním vstupu
    1.85 +			env->SetObjectArrayElement(args, 3, env->NewStringUTF("--data"));
    1.86 +			env->SetObjectArrayElement(args, 4, env->NewStringUTF("2"));
    1.87 +			env->SetObjectArrayElement(args, 5, env->NewStringUTF("a"));
    1.88 +			env->SetObjectArrayElement(args, 6, env->NewStringUTF("b"));
    1.89 +			env->SetObjectArrayElement(args, 7, env->NewStringUTF("c"));
    1.90 +			env->SetObjectArrayElement(args, 8, env->NewStringUTF("d"));
    1.91 +
    1.92 +
    1.93 +			for (int i = 0; i < 10; i++) {
    1.94 +				env->CallStaticVoidMethod(cls, mid, args);
    1.95 +				// FIXME: nefuguje – JVM ukončí proces → vlákna/procesy
    1.96 +			}
    1.97 +
    1.98 +
    1.99 +		} else {
   1.100 +			wprintf(L"Metoda nebyla nalezena: %s\n", methodName.c_str());
   1.101 +		}
   1.102 +	} else {
   1.103 +		wprintf(L"Třída nebyla nalezena: %s\n", className.c_str());
   1.104 +	}
   1.105 +
   1.106 +	jvm->DestroyJavaVM();
   1.107 +	return 0;
   1.108 +}
   1.109 +