Используя ncurses из Java через JNI, изменение размера окна не вызывает получение до тех пор, пока не будет нажата клави ⇐ JAVA
Используя ncurses из Java через JNI, изменение размера окна не вызывает получение до тех пор, пока не будет нажата клави
Моя цель — создавать текстовые приложения на языках JVM,
и теперь я пытаюсь использовать ncurses с JNI.
Когда я использую ncurses непосредственно из C, изменение размера терминала вызовет getch() и вернет 410 (KEY_RESIZE).
Но я использую ncurses через JNI, getch() ничего не сделает, пока не нажму любую другую клавишу.
[*]Это ограничение JVM? [*]Какое решение этой ситуации? [*]или мне вообще не следует использовать ncurses через JNI?
Вот полный воспроизводимый код:
public class Main { public static own void init(); public static own int getch(); public static own void printw (String string); public static own void endwin(); public static void main(String[] args) { System.loadLibrary("jcurses"); в этом(); for (int key; (key = getch()) != 'q';) printw("%d\n".formatted(ключ)); эндвин(); } } #include #include "Main.h" JNIEXPORT void JNICALL Java_Main_init(JNIEnv *env, jclass clazz) { иницкр(); клавиатура (stdscr, TRUE); ноэхо(); } JNIEXPORT jint JNICALL Java_Main_getch(JNIEnv *env, jclass clazz) { возврат (длинный) getch(); } JNIEXPORT void JNICALL Java_Main_printw(JNIEnv *env, jclass clazz, jstring javaString) { const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0); printw("%s",nativeString); (*env)->ReleaseStringUTFChars(env, javaString,nativeString); } JNIEXPORT void JNICALL Java_Main_endwin(JNIEnv *env, jclass clazz) { эндвин(); } все: javac -h. Main.java gcc -I"$$JAVA_HOME/include" -I"$$JAVA_HOME/include/linux" jcurses.c -shared -o libjcurses.so -lncurses бегать: java -Djava.library.path=. Основной Для сравнения, вот чистый код C, делающий то же самое.
Изменение размера окна немедленно отобразит 410, но не может сделать то же самое с JNI.
#include интервал основной() { иницкр(); клавиатура (stdscr, TRUE); ноэхо(); for (int key; (key = getch()) != 'q';) printw("%d\n", ключ); эндвин(); вернуть 0; } Проверено на устройствах ниже:
[*]x86 ubuntu22.04, ssh из Windows 7 git bash [*]arm64 ubuntu22.04, собственный терминал gnome
Моя цель — создавать текстовые приложения на языках JVM,
и теперь я пытаюсь использовать ncurses с JNI.
Когда я использую ncurses непосредственно из C, изменение размера терминала вызовет getch() и вернет 410 (KEY_RESIZE).
Но я использую ncurses через JNI, getch() ничего не сделает, пока не нажму любую другую клавишу.
[*]Это ограничение JVM? [*]Какое решение этой ситуации? [*]или мне вообще не следует использовать ncurses через JNI?
Вот полный воспроизводимый код:
public class Main { public static own void init(); public static own int getch(); public static own void printw (String string); public static own void endwin(); public static void main(String[] args) { System.loadLibrary("jcurses"); в этом(); for (int key; (key = getch()) != 'q';) printw("%d\n".formatted(ключ)); эндвин(); } } #include #include "Main.h" JNIEXPORT void JNICALL Java_Main_init(JNIEnv *env, jclass clazz) { иницкр(); клавиатура (stdscr, TRUE); ноэхо(); } JNIEXPORT jint JNICALL Java_Main_getch(JNIEnv *env, jclass clazz) { возврат (длинный) getch(); } JNIEXPORT void JNICALL Java_Main_printw(JNIEnv *env, jclass clazz, jstring javaString) { const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0); printw("%s",nativeString); (*env)->ReleaseStringUTFChars(env, javaString,nativeString); } JNIEXPORT void JNICALL Java_Main_endwin(JNIEnv *env, jclass clazz) { эндвин(); } все: javac -h. Main.java gcc -I"$$JAVA_HOME/include" -I"$$JAVA_HOME/include/linux" jcurses.c -shared -o libjcurses.so -lncurses бегать: java -Djava.library.path=. Основной Для сравнения, вот чистый код C, делающий то же самое.
Изменение размера окна немедленно отобразит 410, но не может сделать то же самое с JNI.
#include интервал основной() { иницкр(); клавиатура (stdscr, TRUE); ноэхо(); for (int key; (key = getch()) != 'q';) printw("%d\n", ключ); эндвин(); вернуть 0; } Проверено на устройствах ниже:
[*]x86 ubuntu22.04, ssh из Windows 7 git bash [*]arm64 ubuntu22.04, собственный терминал gnome
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение