繁体   English   中英

关于Java中加载库和native方法的几个问题

[英]A few questions about loading libraries and native methods in Java

我试图理解为什么我的代码在不同的操作系统中运行时挂起的部分尝试,我不得不调试不同的 eclipse 插件。 我在一些 Java 文件中看到了以下代码:

Library.loadLibrary("swt")

基于什么是 Java 中的本机方法以及应该在哪里使用它们? ,我知道本机方法用于执行用不同编程语言编写的函数。 但我有两个问题:

  1. 当使用输入"swt"调用loadLibrary时,实际发生了什么? loadLibrary在哪里寻找 SWT 库,我该如何更改它? Linux中获取库的等效命令是什么(我猜它是一些共享库)?
  2. 考虑以下代码:
    public static final native void _gtk_widget_destroy(long /*int*/ widget);
    public static final void gtk_widget_destroy(long /*int*/ widget) {
        lock.lock();
        try {
            _gtk_widget_destroy(widget);
        } finally {
            lock.unlock();
        }
   }

_gtk_widget_destroy方法是本机的。 这是否意味着在另一种语言(可能是 C)中存在一种称为_gtk_widget_destroy的方法? 我怎么知道这个方法来自哪个库(可能是 SWT)?

System.loadLibrary("X")使用System#mapLibraryName来构造实际的库名称。 在 Linux 上是libX.so ,在 Mac 上是libX.dylib ,在 Windows 上是libX.dll

然后它在java.library.path (VM 属性)的每个条目中搜索具有该名称的库。

对于第二个问题:您还需要周围类的完整命名空间和类名。 快速搜索告诉我该方法的全名是org.eclipse.swt.internal.gtk.GTK#_gtk_widget_destroy 现在,有两种选择:

  • libswt.so调用RegisterNatives将此方法绑定到函数指针(通常在其JNI_OnLoad方法中)。 情况并非如此。
  • 它使用通用名称修饰方案,这将产生一个名为Java__org_eclipse_swt_internal_gtk_GTK_1gtk_1widget_1destroy的符号。 似乎开发人员已将那个长名称抽象为一个宏 您可以使用标准nm工具来确定给定的 .so 文件是否包含该符号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM