Я недавно читал о Панамский проект.
Я понимаю, что это будет замена 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?
Дополнительные ссылки:
Формат 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
Есть еще мысли по этому вопросу?