首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNI-8羔羊支持?

JNI-8羔羊支持?
EN

Stack Overflow用户
提问于 2014-03-20 18:45:56
回答 1查看 1.6K关注 0票数 4

现在Java8已经在这里正式发布了:http://www.oracle.com/technetwork/java/javase/downloads/index.html

有人知道我们是否可以实例化java或从JNI调用它们吗?关于如何使用Lambdas和Java中的所有新特性,有很多文档,但JNI :S没有。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-14 09:29:42

Lambda表达式是编译时Java语言级工件。Java编译器将将表达式编译为合成方法,并生成创建函数接口实例所需的代码,函数接口的单个抽象方法将调用该方法。

因为JNI是一个运行时接口,所以从JNI的角度来看,没有比lambda表达式更好的东西了。只有JRE生成的功能接口实现可以执行预构建的方法。它们可能是为了实现lambda表达式、方法引用而创建的,或者只是手动创建的,因为创建工具是公共JRE的一部分。

“调用lambda”非常简单,因为“调用lambda”意味着在这样一个生成的实例上调用函数接口的单个抽象接口方法。不需要任何特殊的JNI函数,就像不需要使用特殊的Java语言特性来调用该方法一样。

JNI在生成lambda时所能做的就是告诉JRE生成一个函数接口实现,该实现将调用指定的方法。如果目标方法是由Java编译器为lambda表达式生成的合成方法,那么您已经通过JNI创建了lambda。否则,生成的实例将表现为对目标方法的方法引用。

这个答案展示了如何使用纯Java代码生成这样的实例。它大部分由普通的方法调用组成,JNI也可以调用这些调用。唯一棘手的部分是调用由MethodHandle返回的CallSite表示的工厂方法。由于JNI不能调用invokeinvokeExact,所以必须在创建的最后一步调用invokeWithArguments

总之,创建过程的中心是方法LambdaMetafactory.metafactory,它通常用作invokedynamic指令的引导方法,但也可以像普通方法一样调用,包括通过JNI调用。它的文档以及这是类文档都相当全面。

请注意,这甚至不是一个全新的东西。有限的前身已经存在于Java7中。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22542367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档