Java 10 巴拿马项目 - 将 JNI 解决方案移植到巴拿马
Java 10 Panama Project - port JNI solutions to Panama
我最近一直在阅读有关 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 解决方案是否需要手动重构?
附加链接:
- OpenJDK: Panama
- Working with Native Libraries in Java
- JEP 191: Foreign Function Interface thanks to a comment made by Holger
JNI格式如下:
Java -> JNI glue-code library -> Native code
巴拿马项目的目标之一是移除这个中间层并得到:
Java -> Native code
思路是可以使用命令行工具处理原生头文件(.h
)生成调用原生代码的Java接口,JDK 代码将在运行时完成剩下的工作,只要将两者连接在一起即可。
如果您当前的 JNI 代码在此粘合代码层中做了很多事情,那么在移植到巴拿马时可能必须在 Java 端重新编写。 (这取决于使用的接口提取工具可以自动完成多少)。
但是如果您使用的是 JNA 或 JNR 之类的东西,那么迁移到巴拿马应该相对容易,因为这两个 API 具有非常相似的 API,您也可以在其中将接口绑定到本机库。
但是这样的问题:
will there be a solution for porting existing JNI solutions to the Panama format?
很难回答,因为没有人能预测未来。我觉得 panama 和 JNI 之间有足够多的差异,这两者之间的自动 1 对 1 转换可能是不可能的。尽管如果您的胶水代码除了转发参数之外没有做太多事情,那么接口提取工具可能会为您完成所有工作。
如果您有兴趣,可以查看最近开始发售的巴拿马抢先体验版本:https://jdk.java.net/panama/
或者观看最近关于它的讨论:https://youtu.be/cfxBrYud9KM
我最近一直在阅读有关 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 解决方案是否需要手动重构?
附加链接:
- OpenJDK: Panama
- Working with Native Libraries in Java
- JEP 191: Foreign Function Interface thanks to a comment made by Holger
JNI格式如下:
Java -> JNI glue-code library -> Native code
巴拿马项目的目标之一是移除这个中间层并得到:
Java -> Native code
思路是可以使用命令行工具处理原生头文件(.h
)生成调用原生代码的Java接口,JDK 代码将在运行时完成剩下的工作,只要将两者连接在一起即可。
如果您当前的 JNI 代码在此粘合代码层中做了很多事情,那么在移植到巴拿马时可能必须在 Java 端重新编写。 (这取决于使用的接口提取工具可以自动完成多少)。
但是如果您使用的是 JNA 或 JNR 之类的东西,那么迁移到巴拿马应该相对容易,因为这两个 API 具有非常相似的 API,您也可以在其中将接口绑定到本机库。
但是这样的问题:
will there be a solution for porting existing JNI solutions to the Panama format?
很难回答,因为没有人能预测未来。我觉得 panama 和 JNI 之间有足够多的差异,这两者之间的自动 1 对 1 转换可能是不可能的。尽管如果您的胶水代码除了转发参数之外没有做太多事情,那么接口提取工具可能会为您完成所有工作。
如果您有兴趣,可以查看最近开始发售的巴拿马抢先体验版本:https://jdk.java.net/panama/
或者观看最近关于它的讨论:https://youtu.be/cfxBrYud9KM