返回介绍

A.3.1 @dll.import 引导命令

发布于 2024-10-15 23:56:37 字数 2077 浏览 0 评论 0 收藏 0

作为使用 J/Direct 唯一的途径,@dll.import 引导命令相当灵活。它提供了为数众多的修改符,可用它们自定义同非 Java 代码建立链接关系的方式。它亦可应用于类内的一些方法,或应用于整个类。也就是说,我们在那个类内声明的所有方法都是在相同的 DLL 里实现的。下面让我们具体研究一下这些特性。

1. 别名处理和按顺序链接

为了使 @dll.import 引导命令能象上面显示的那样工作,DLL 内的函数必须按名字导出。然而,我们有时想使用与 DLL 里原始名字不同的一个名字(别名处理),否则函数就可能按编号(比如按顺序)导出,而不是按名字导出。下面这个例子声明了 FinestraDiMessaggio()(用意大利语说的“MessageBox”)。正如大家看到的那样,使用的语法是非常简单的。

public class Aliasing {
  public static void main(String args[]) 
  throws UnsatisfiedLinkError   {
    FinestraDiMessaggio(0,
      "Created by the MessageBox() Win32 func",
      "Thinking in Java", 0);
  }
  /** @dll.import("USER32", 
  entrypoint="MessageBox") */
  private static native int 
  FinestraDiMessaggio(int hwndOwner, String text,
    String title, int fuStyle);
}

下面这个例子展示了如何同 DLL 里并非按名字导出的一个函数建立链接,那个函数事实是按它们在 DLL 里的位置导出的。这个例子假设有一个名为 MYMATH 的 DLL,这个 DLL 在位置编号 3 处包含了一个函数。那个函数获取两个整数作为自变量,并返回两个整数的和。

public class ByOrdinal {
  public static void main(String args[]) 
  throws UnsatisfiedLinkError {
    int j=3, k=9;
    System.out.println("Result of DLL function:"
      + Add(j,k));
  }
  /** @dll.import("MYMATH", entrypoint = "#3") */
  private static native int Add(int op1,int op2);
}

可以看出,唯一的差异就是 entrypoint 自变量的形式。

2. 将 @dll.import 应用于整个类

@dll.import 引导命令可应用于整个类。也就是说,那个类的所有方法都是在相同的 DLL 里实现的,并具有相同的链接属性。引导命令不会由子类继承;考虑到这个原因,而且由于 DLL 里的函数是自然的 static 函数,所以更佳的设计方案是将 API 函数封装到一个独立的类里,如下所示:

/** @dll.import("USER32") */
class MyUser32Access {
  public static native int 
  MessageBox(int hwndOwner, String text,
    String title, int fuStyle);
  public native static boolean 
  MessageBeep(int uType);
}

public class WholeClass {
  public static void main(String args[]) 
  throws UnsatisfiedLinkError {
    MyUser32Access.MessageBeep(4);
    MyUser32Access.MessageBox(0,
      "Created by the MessageBox() Win32 func",
      "Thinking in Java", 0);
  }
}

由于 MessageBeep() 和 MessageBox() 函数已在不同的类里被声明成 static 函数,所以必须在调用它们时规定作用域。大家也许认为必须用上述的方法将所有 Win32 API(函数、常数和数据类型)都映射成 Java 类。但幸运的是,根本不必这样做。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文