В общем дело было вечером делать было нечего, и захотелось одному уважаемому подключить JNI к проекту.
Но не тут то было, оказывается JVM принимает на вход специальную структурку с опциями, в которых строка это указатель на строку (char *).. Долго не думая конвертирую все это дело в char* вот таким образом.
JavaVMOption options[alength];
foreach(QString param, jargs)
{
static int i = 0;
QByteArray arr = param.toLocal8Bit();
char * pbuff = arr.data();
options[i].optionString = pbuff;
i++;
}
Где jargs это QStringList. Так вот, указатель та выдается, но и в какой-то момент теряется
Выделенным показаны значения на строки в структуре. JavaVM соответственно так-же ругается "Unrecognized option: ...".
Вот структурки
typedef struct JavaVMOption {
char *optionString;
void *extraInfo;
} JavaVMOption;
typedef struct JavaVMInitArgs {
jint version;
jint nOptions;
JavaVMOption *options;
jboolean ignoreUnrecognized;
} JavaVMInitArgs;
А вот полный код метода.
/**
* Метод запуска виртуальной среды java.
* @brief Jvm::launchJVM
*/
bool Jvm::launchJVM()
{
jint alength = (jint)jargs.length();
__debug_p("Args lenght" << alength);
if(alength < 1)
{
__DEBUG_P("No java options");
return false;
}
__DEBUG_P("Launching Java VM...");
JavaVMOption options[alength];
foreach(QString param, jargs)
{
static int i = 0;
//options[i].optionString = param.toLatin1().data();
QByteArray arr = param.toLocal8Bit();
char * pbuff = arr.data();
options[i].optionString = pbuff;
//options[i].optionString = const_cast<char*>(param.toStdString().c_str());
i++;
}
for(int i = 0; i < alength; i++)
{
qDebug() << "%$$%$%$%POINTER IN STRUCT" << options[i].optionString << endl;
}
JavaVMInitArgs vm_args;
jint ret = JNI_GetDefaultJavaVMInitArgs(&vm_args);
if(ret == JNI_ERR)
__debug_p("Error while loading default jvm init args");
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = alength;
vm_args.ignoreUnrecognized = JNI_FALSE;
jint code = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if(code == JNI_ERR)
{
__DEBUG_P("JVM is not runned, error code" << code);
return false;
}
__DEBUG_P("JVM runned successful");
emit JavaVMRunned(env);
return true;
}
Как быть?