Перманентное сохранение указателя на char* из QString, как?

В общем дело было вечером делать было нечего, и захотелось одному уважаемому подключить 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: ...".
306b2897f8e7421f9505f6985eaf0fcd.png

Вот структурки
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;
}

Как быть?
  • Вопрос задан
  • 383 просмотра
Решения вопроса 1
@MiiNiPaa
Конечно теряется. У вас arr локальна для тела цикла. Как только очередная итерация заканчивается, полученый указатель становится невалидным.
Убедитесь, что память на которую ссылается указатель не освобождается, пока JVM не закончит работу с ней.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Zifix
@Zifix Куратор тега Qt
Barbatum
Уважаемый, скорее всего надо как-то так.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы