Java 10 Панамский проект - порт решения 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 должны быть реорганизованы вручную?

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

1 ответ

Формат JNI выглядит следующим образом:

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

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

Java -> Native code

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

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

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

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

будет ли решение для переноса существующих решений JNI в панамский формат?

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

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

Или посмотрите недавний разговор об этом: https://youtu.be/cfxBrYud9KM

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