【问题标题】:How do I know whether my Java application uses "native code"?我如何知道我的 Java 应用程序是否使用“本机代码”?
【发布时间】:2011-09-14 08:15:29
【问题描述】:

recent question 上,我让 cmets 询问我是否在我的应用程序中使用“本机代码”。现在,我知道有一些方法可以使用 a thing called "JNI" 从 Java 应用程序内部调用传统二进制库(DLL、SO)中的代码。我已经阅读了那个 Wikipedia 条目,但我从未使用过它。

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

【问题讨论】:

  • 许多使用操作系统的函数,比如 IO,线程都在某处使用本地方法。编写一个从不使用本机调用的有用程序是不可能的(无论你是否知道)
  • 您可以获取 linux 中已加载库的列表,例如:cat /proc/processId/maps | grep ".so" 在 Windows 进程资源管理器上可以显示加载的 DLL,最后,您可以安装 SecurityManager(在 java 中)来跟踪任何正在加载的库,方法称为checkLink,权限名称以“loadLibrary”开头

标签: java java-native-interface


【解决方案1】:

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

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

然而还有JNA,它是JNI 的一个包装器,它简化了它的使用并且有时不需要进行任何显式设置。如果您的某个库使用了它,则更难检测到。

如果您收到故障转储,则检查是否存在任何非标准库可以提示是否应归咎于用户加载的本机库。

【讨论】:

  • 我可能正在使用“非常专业的库”。例如,有一个通过 TCP 执行 Modbus,在我们对其进行修补之前,它包含与串行驱动程序相关的内容......
  • 是的,这肯定有资格使用这样的库。并感谢您的修复;-)
  • 哎呀。一种看似危险的技术的包装,它并没有降低它的危险性,只是更难分析和更容易使用。听起来让我毛骨悚然。
【解决方案2】:

吹毛求疵,每个 Java 应用程序至少间接使用 JNI。例如,System 类包含几个 native 方法,这些方法映射到本机 JRE(从其源代码可以看出)。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多