Проект Java 10 Panama - перенос решений JNI в Панаму

Я недавно читал о Панамский проект.

Я понимаю, что это будет замена JNI следующего поколения - это позволит Java-разработчикам кодировать на нативном уровне с использованием Java (что потрясающе, IMHO).

Использование простое из того, что я могу сказать, глядя на jnr-posix, например:

public class FileTest {
    private static POSIX posix;

    @BeforeClass
    public static void setUpClass() throws Exception {
        posix = POSIXFactory.getPOSIX(new DummyPOSIXHandler(), true);
    }

    @Test
    public void utimesTest() throws Throwable {
        // FIXME: On Windows this is working but providing wrong numbers and therefore getting wrong results.
        if (!Platform.IS_WINDOWS) {
            File f = File.createTempFile("utimes", null);

            int rval = posix.utimes(f.getAbsolutePath(), new long[]{800, 200}, new long[]{900, 300});
            assertEquals("utimes did not return 0", 0, rval);

            FileStat stat = posix.stat(f.getAbsolutePath());

            assertEquals("atime seconds failed", 800, stat.atime());
            assertEquals("mtime seconds failed", 900, stat.mtime());

            // The nano secs part is available in other stat implementations. We really just want to verify that the
            // nsec portion of the timeval is passed through to the POSIX call.
            // Mac seems to fail this test sporadically.
            if (stat instanceof NanosecondFileStat && !Platform.IS_MAC) {
                NanosecondFileStat linuxStat = (NanosecondFileStat) stat;

                assertEquals("atime useconds failed", 200000, linuxStat.aTimeNanoSecs());
                assertEquals("mtime useconds failed", 300000, linuxStat.mTimeNanoSecs());
            }

            f.delete();
        }
    }
// ....
// ....
// ....
}

У меня такой вопрос - поработав с JNI и зная, насколько это громоздко, будет ли решение для переноса существующих решений JNI в формат Панамы?

IE - просмотреть сгенерированный (через устаревший javah) заголовочный файл C и данную реализацию заголовочного файла на C, определить функции, которые могут быть заменены Panama API, а затем сгенерировать выходной файл java?

Или нужно будет вручную реорганизовать существующие решения JNI?

Дополнительные ссылки:

Есть еще мысли по этому вопросу?

Rann Lifshitz 05.05.2018 10:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
1
1 797
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Формат JNI следующий:

Java -> JNI glue-code library -> Native code

Одна из целей проекта panama - убрать этот средний слой и получить:

Java -> Native code

Идея состоит в том, что вы можете использовать инструмент командной строки для обработки файла собственного заголовка (.h), чтобы сгенерировать интерфейс Java для вызова собственного кода, а код JDK сделает все остальное во время выполнения, если соединить два вместе.

Если ваш текущий код JNI делает много чего на этом слое связующего кода, то, возможно, придется переписать его на стороне Java при переносе на Панаму. (это зависит от того, насколько много может быть сделано автоматически с помощью используемого инструмента извлечения интерфейса).

Но если вы используете что-то вроде JNA или JNR, то переход в Панаму должен быть относительно простым, поскольку эти 2 имеют очень похожие API, где вы также привязываете интерфейс к собственной библиотеке.

Но такие вопросы, как:

will there be a solution for porting existing JNI solutions to the Panama format?

Сложно ответить, так как никто не может предсказать будущее. Я считаю, что существует достаточно различий между панамой и JNI, поэтому автоматическое преобразование 1 в 1 между 2, вероятно, будет невозможно. Хотя, если ваш связующий код не делает ничего, кроме пересылки аргументов, инструмент извлечения интерфейса, вероятно, сможет сделать всю работу за вас.

Если вам интересно, вы можете взглянуть на сборки раннего доступа panama, которые недавно начали поставляться: https://jdk.java.net/panama/

Или посмотрите недавний разговор об этом: https://thewikihow.com/video_cfxBrYud9KM

Другие вопросы по теме