JNI запускает jvm с поддержкой юникода

Я использую вызов API для загрузки и запуска JVM в коде C. Для этого я использую структуру Java JavaVMOption. В частности, я использую его элемент char *optionString, чтобы указать мой -Dbs.prefsdir="c:\\develop\\XXXXChineseMixedLationCharsXXXX\\", где bs.prefdir - это путь, который может быть определен пользователем.

То, что я делаю, прямо из примеров Java, и оно отлично работает вплоть до того момента, когда мне нужно использовать путь с широкими символами/юникодами - я не могу этого сделать, потому что optionString - это char * не wchar_t *. Кто-нибудь знает, как обойти это? Решения должны быть ограничены JDK 1.6 и ниже.

Я внимательно прочитал документацию JNI: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp633

char *optionString;  /* the option as a string in the default platform encoding */

Я прочитал часть исходного кода исполняемого файла запуска eclipse, там он сделал что-то вроде преобразования широких символов в многобайтовые символы с кодовой страницей по умолчанию:

int byteCount = WideCharToMultiByte (CP_ACP, 0, (wchar_t *)src, -1, NULL, 0, NULL, NULL);
    char *dest = malloc(byteCount+1);
    dest[byteCount] = 0;
    WideCharToMultiByte (CP_ACP, 0, (wchar_t *)src, -1, dest, byteCount, NULL, NULL);
    return dest;

Я попытался обработать optionString как многобайтовую строку символов, используя приведенный выше код, и это не работает. Я пытался рассматривать его как сам юникод, но это тоже не работает. У кого-нибудь есть решение для этого, пожалуйста?


person WeidongLian    schedule 18.11.2013    source источник
comment
Не знаю, есть ли решение для аргументов командной строки. Но поскольку вы хотите указать только параметр -D, вы можете использовать JNI для вызова System.setProperty, чтобы добиться того же.   -  person Holger    schedule 18.11.2013
comment
Спасибо за ваше предложение. Я пробовал решение, которое вы предложили выше, однако я не знаю, может ли пользователь устанавливать другие параметры, bs.prefsdir - это только пример, мне нужно поддерживать юникод в командной строке и для других параметров. Лаунчер Eclipse работает нормально. Я не знаю, что такое магия в пусковой установке eclipse? В большинстве случаев я использую средство запуска eclipse для запуска своего приложения в исполняемых файлах, таких как исполняемый файл eclipse. Иногда мне нужно запустить jvm и загрузить его в процесс dotnet, поэтому мне нужно передать и поддерживать юникод с помощью JavaVMOption.   -  person WeidongLian    schedule 18.11.2013
comment
Возможно, поможет просмотр исходного кода программы запуска eclipse.   -  person Holger    schedule 18.11.2013
comment
@ user3005398 Eclipse не вызывает JNI_CreateJavaVM; Он передает эти аргументы в командную строку. Это не одно и то же   -  person Samhain    schedule 18.11.2013
comment
Не могли бы вы рассказать немного, как примерно это работает? Или ссылки на это? вроде тем меньше.   -  person WeidongLian    schedule 19.11.2013


Ответы (1)


Аргументы, передаваемые в JNI_CreateJavaVM, находятся в кодировке платформы по умолчанию, поэтому я не верю, что вы сможете передать строку широкобайтовых символов в структуру JavaVMOption.

Попробуйте предложение Хольгера установить системное свойство с помощью jstring правильного стиля кодирования после создания JVM.

person Samhain    schedule 18.11.2013