我如何知道我的Java应用程序是否使用“本机代码”?

时间:2011-09-14 08:15:30

标签: java java-native-interface

recent question上,我收到评论,询问我是否在我的应用程序中使用“本机代码”。现在,我知道有一些方法可以使用a thing called "JNI"从Java应用程序内部调用传统二进制库(DLL,SO)中的代码。我读过维基百科条目,但我从未使用过这个。

我使用了许多库,其中一些可能会也可能不会使用本机代码。我怎么知道他们是否这样做?我没有安装任何SO(在Linux上运行),但我想这并不意味着库没有使用任何?我是否必须浏览所有文档(库之间的质量差异很大)或者我可以对JAR进行一些分析吗?

4 个答案:

答案 0 :(得分:4)

通常使用需要JNI的库需要一些额外的设置(例如将.dll.so文件放在正确的位置或设置java.library.path系统属性)

如果你什么也没做,那么很可能你没有在任何地方使用JNI。这也有可能,因为只有非常专业的库需要JNI。

然而还有JNA,它是JNI的包装器,它简化了它的使用,有时不需要进行任何显式设置。如果你的某个库使用了它,那么就很难检测到它。

如果你得到崩溃转储,那么检查任何非标准库是否可以提示是否应该责备用户加载的本机库。

答案 1 :(得分:1)

为了挑剔,每个Java应用程序至少间接使用JNI。例如,System类包含多个native方法,这些方法映射到本机JRE(从其源代码中可以看出)。

您的程序/库是否(直接或间接)使用除标准JRE中包含的其他本机功能,确实很难检测到。 .dll s / .so可以打包到.jar中,仅在需要时提取,因此不必安装本机库并不能保证它不使用任何。但是,通常应该在库文档中说明,因为供应商可能不会为Java运行的每个可以想象的系统提供二进制文件。但可以肯定的是,我认为唯一的方法是浏览native方法的源代码。

答案 2 :(得分:1)

如果java库(jar)使用本机库(Windows上的 dll 或Linux上的 so ),则可能是系统范围内众所周知的库(例如Linux上的glibc)或自定义的。在最后一种情况下,将它打包在jar中是很常见的,所以你可以用ZIP解压缩器打开它(即Windows上的7zip就可以了)并浏览文件。您应该看到 dll 文件(如果它是针对Windows的话), so 文件(如果是针对Unix平台的,或者两者都是)。本机库文件通常保留在jar的根级别。

如果jar使用自定义库但它与应用程序一起打包,通常将本机库保留在包含其他应用程序文件的外部文件夹中(在这种情况下,没有共识)。在这种情况下,如果lanucher是二进制文件( ini ),您应该查找应用程序启动器( bat / sh 文件)或配置文件/ conf 文件)并找出JVM配置(java.library.path指向的位置)。

答案 3 :(得分:1)

最简单的方法可能是使用jmap或pmap来显示哪些.so(共享对象)文件被映射到Java进程中。如果除了/ lib,/ usr / lib或Java lib目录之外还有其他东西,那么它就是JNI的怀疑。您还可以在/ proc /< pid> / maps下查看Java进程的/ proc条目。请参阅以下联机帮助页: