javah
has been deprecated since JDK 8 and will be/has been removed in JDK 10,根据JEP 313和弃用文本,应该使用带有-h
标志的javac
:
警告:javah
工具计划在下一个主要JDK版本中删除。该工具已被JDK 8中添加到javac
的“-h”选项所取代。建议用户使用javac
“-h”选项迁移到;有关详细信息,请参阅javac手册页。
问题是,javah
对编译后的.class
文件进行操作,而javac
对源文件(即.java
文件)进行操作。javah
可以很好地与Kotlin和external
函数一起工作,因为所有内容最终都被编译为Java字节码,但由于使用Kotlin时没有任何Java源文件,我看不出javac -h
有任何工作方式。
Kotlin是否有javah
替代品或解决方案?
5条答案
按热度按时间xvw2m8pv1#
我写了一个简单的gradle任务来生成JNI头文件,它的方法与@Oo.oO发布的类似,但与gradle有更好的集成,因此可以在Windows和基于Unix的操作系统上运行。
字符串
toe950272#
我推荐gjavah。
在未来,我还将实现一个易于使用的命令行工具,它提供与javah类似的功能。
cnjp1d6j3#
目前还没有内置的方法来做到这一点。2019年11月提出了an open issue for this on the Kotlin issue tracker,但截至目前,它还没有被优先考虑,也没有目标版本。
在JDK 10+中生成头文件的唯一方法是使用
javac -h
,它只适用于Java源代码,而不适用于Kotlin。我在Oo.oO链接的How to solve missing javah in Java 10 – ugly way中测试了这个方法,它目前可以作为一个解决方案。步骤是:1.使用
javap
将字节码反编译回Java1.编辑反编译后的Java,使其适合生成头文件(将文件缩减为仅包含
native
方法定义)。1.通过
javac -h
运行反编译的Java代码以生成头文件我正在考虑写一个gradle脚本来完成这个任务(或者希望有人能比我先完成!)。如果我能完成这个任务,我会更新这篇文章。
jckbn6z74#
在Kotlin开始生成特定于JDK 10的字节码之前,您可以在已编译的Kotlin类上使用JDK 9或更低版本的
javah
工具。甚至在此之后,您可以使用
jvmTarget=1.8
编译external
函数,并在生成的类上使用javah
。c86crjj05#
您也可以使用
javap
并基于class
文件创建facade类。看看这里的一个例子:http://www.owsiak.org/how-to-solve-missing-javah-ugly-way/