ich habe eine (Java executable archiv) extern.jar welche ich in meinem Qt Projekt mit JNI starte. Läuft auch soweit sogut.
Problem ist folgender: DIe externe.jar hört aufm Lokalhost an ein bestimmtes Port. Diese Message sollte eig. vom Qt-Projekt gesendet werden. Geht net, da die externe.jar durch ihr SocketListen blockiert.
Da aber die KommandoZeile meines Qt-Projekts durch das extern.jar zugemüllt wird und ich das extern.jar unabhängig von meinem Projekt laufen lassen würde, möcht ich es gerne als separaten Thread starten (also am liebstan IN eigener CMD.exe). Im Netz habe ich QThread gefunden und die Header enthält Q_OBJECt und erbt von QThread. Dann Methode run() mit exec() .. Was fehlt mir?:
Code: Alles auswählen
#include <jni.h>
#include "ExternJar.h"
#pragma comment (lib,"C:\\Program Files\\Java\\jdk1.6.0_26\\lib\\jvm.lib")
/// Constructor
ExternJar::ExternJar(const char* pPathToJar, const char* pPathToLib, const char *t_argv, const char *t_path2Package, const char* t_methodName)
{
int oi = 0;
options[oi++].optionString = const_cast<char*>(pPathToJar);
options[oi++].optionString = "-verbose:jni";
vm_args.nOptions = oi;
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_FALSE;
argumentString = t_argv;
path2Jar = pPathToJar;
path2Lib = pPathToLib;
packagePath = t_path2Package;
methodName = t_methodName;
debugMode = 0;
}
void ExternJar::setClassName()
{
switch(JNI_CreateJavaVM( &jvm,(void **)&env, &vm_args)) {
case JNI_ERR:
printf("\nUnknown Error invoking the JVM\n");
return;
case JNI_EDETACHED:
printf("\nThread detached from the JVM\n");
return;
case JNI_EVERSION:
printf("\nJNI version error\n");
return;
case JNI_ENOMEM:
printf("\nNot enough memory the JVM\n");
return;
case JNI_EEXIST:
printf("\nJVM already created\n");
return;
case JNI_EINVAL:
printf("\nInvalid arguments\n");
return;
case JNI_OK:
if (debugMode == 1)printf("\nJVM created --> Ready ...\n");
}
if( NULL == (cls = env->FindClass(packagePath)) ) printf("\nCan't find class %s\n", packagePath);
else if (debugMode == 1) printf("\nClass %s found!\n", packagePath);
}
void ExternJar::setArgCV()
{
if (!argumentString) return;
this->applicationArg0 = env->NewStringUTF(argumentString);
this->applicationArgs = env->NewObjectArray(1, env->FindClass("java/lang/String"), applicationArg0);
env->SetObjectArrayElement(applicationArgs, 0, applicationArg0);
}
void ExternJar::setMethodName()
{
mid = env->GetStaticMethodID(cls, methodName, "([Ljava/lang/String;)V");
if (debugMode == 1) printf("\nMethod name set to: %s", methodName);
}
void ExternJar::callXMethod()
{
// Method call
if (debugMode == 1) printf("\nCall now \n%s(\"%s\"):", methodName, argumentString);
if (mid != NULL) env->CallStaticVoidMethod(cls, mid, applicationArgs);
else printf("\nMethod %s corrupted!\n", mid);
}
JavaVM * ExternJar::getVM()
{
return this->jvm;
}
void * ExternJar::getEnv()
{
return this->env;
}
bool ExternJar::destroyVM()
{
if (debugMode == 1) printf("\nDestroy VM now!");
if ( this->getVM()->DestroyJavaVM() == 1 ) return true;
else return false;
}
void ExternJar::run()
{
this->setClassName();
this->setArgCV();
this->setMethodName();
this->callXMethod();
exec();
}
Mfg LesPaul