我最近一直在阅读Panama Project。
我知道它将成为JNI的下一代替代品 - 它将允许Java开发人员使用Java在本机层上进行编码(这是令人惊叹的恕我直言)。
从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解决方案是否需要手工重构?
其他链接:
答案 0 :(得分:4)
JNI格式如下:
Java -> JNI glue-code library -> Native code
巴拿马项目的目标之一是删除中间层并获得:
Java -> Native code
这个想法是,您可以使用命令行工具来处理本机头(.h
)文件,以生成用于调用本机代码的Java接口,而JDK代码将在运行时完成其余工作就像将2连接在一起一样。
如果您当前的JNI代码在此粘合代码层中做了很多工作,那么在移植到巴拿马时,可能必须在Java方面重新编写。 (这取决于所使用的界面提取工具可以自动完成多少工作。)
但是,如果您使用的是JNA或JNR之类的东西,那么迁移到巴拿马应该相对容易,因为这两个具有非常相似的API,您也可以在其中将接口绑定到本地库。
但是这样的问题:
将现有的JNI解决方案移植到巴拿马格式是否会有解决方案?
很难回答,因为没人能预测未来。我觉得panama和JNI之间有足够的差异,以至于2之间不可能自动进行1对1转换。尽管如果您的粘合代码除了转发参数之外没有做很多事情,那么接口提取工具可能会为您完成所有工作。
如果您有兴趣,可以看看最近开始发货的巴拿马的早期使用版本:https://jdk.java.net/panama/
或观看有关它的最近话题:https://youtu.be/cfxBrYud9KM