Ошибка сегментации JavaFX в Linux из-за библиотеки рендеринга шрифтов - PullRequest
0 голосов
/ 25 апреля 2020

При Linux я получаю ошибку сегментации, когда пытаюсь прочитать двоичный файл как символы UTF-8 и отображать их с помощью javafx.scene.Text. Я понятия не имею, что такое враждебные символы, и я не смог успешно отобразить бинарный файл. Это никогда не происходит при Windows, и если я использую другую кодировку, например StandardCharsets.ISO_8859_1, это также никогда не происходит.

РЕДАКТИРОВАТЬ: Добавлен компилируемый пример (это всегда вылетает для меня, мой дистрибутив Linux - Solus) :

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Test extends Application  {

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Hello World!");

        Text text = new Text();

        // Replace with an existing file
        Path path = Paths.get("/home/myname/Test/Rubik-Black.ttf");

        InputStream input = Files.newInputStream(path);

        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));

        char[] buffer = new char[50000];

        reader.read(buffer);

        String str = new String(buffer);

        StackPane root = new StackPane();
        root.getChildren().add(text);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();

        Platform.runLater(() -> {
            text.setText(str);
        });
    }
}

Фрагмент стека трассировки показывает, что проблема, похоже, заключается в библиотеке libpan go (библиотека рендеринга шрифтов / компоновки, используемая JavaFX):

(0x00007FC796177407 [libpango-1.0.so.0+0x20407])
pango_itemize_with_base_dir+0xbf (0x00007FC7961784BF [libpango-1.0.so.0+0x214bf])
pango_itemize+0x59 (0x00007FC796178839 [libpango-1.0.so.0+0x21839])
(0x00007FC81F968DC4 [libj9vm29.so+0x137dc4])
(0x00007FC81F9664D7 [libj9vm29.so+0x1354d7])
(0x00007FC81F85325A [libj9vm29.so+0x2225a])
(0x00007FC81F843B10 [libj9vm29.so+0x12b10])
(0x00007FC81F8FED82 [libj9vm29.so+0xcdd82])

Согласно фрагменту, также кажется, что JavaFX использует очень старую версию libpan go - 1.0, выпущенную в 2009 году.

Кто-нибудь еще сталкивался с этой проблемой и имеет возможные обходные пути - кроме изменения кодировки?

Мой вариант использования заключается в том, что в моем приложении есть функция «принудительного текстового просмотра», которая отображает файл как текстовый.

...