摘要:Java本地接口(Java Native Interface)为Java语言提供了整合其他语言代码的强大能力,在实际开发中我们发现调用C/C++语言写的程序比较简单,而调用其他语言的程序需要一些专门的技巧,本文介绍了如何在Java中调用汇编语言程序,希望对读者有所帮助。
Java本地接口(JNI)提供了一个强大的平台用以整合Java代码和其他语言编写的代码 – 主要是C和C++。尽管从理论上讲,JNI提供了一个相当广义的接口,实际上JNI提供的支持结构主要是基于帮助Java链接C/C++代码。相关的文献资料似乎也主要是介绍链接Java和C/C++的专门方法。
本文演示了让Java代码调用汇编语言编写的代码的技术。用来写演示代码的汇编语言版本是MASM32。我假设本文读者熟悉汇编语言编程特别是MASM32。熟悉Java语言也是需要的。参考资源部分列出了我参考和学习的来源,我希望感兴趣进一步学习的读者也能从这些资源中获得教益。
在正式开始教程之前,有一点我想提醒大家:接下来展示的方法和实例都是基于Windows平台,不过你不用考虑Windows的特定版本,它可以顺利运行于任何版本,我自己在Win 98/2000/XP上面都尝试过没有任何问题。
正如我前面提到的,JNI相关的参考资源都是为C/C++开发准备的。对于使用汇编语言的开发者,必须深入的理解JNI如何对外暴露接口的细节。因此,就让我们来看看JNI的一些内部细节。
JNI入门
当一个Java方法调用汇编语言代码时,一些信息必须从一个语言环境移动到另一个语言环境。调用者通常要传递一些参数给被调用函数,同时被调用函数需要返回一些信息给调用者。除此之外,每个语言环境都需要与另一个语言环境共同工作所需的信息。问题是在Java虚拟机(JVM)中表示的数据和汇编语言环境下的数据是不同的。还有一些资料,尤其是JVM内部的一些是特别底层的,JVM不会向本地语言(C/C++/汇编语言)提供对于这些信息的直接访问。JNI提供了一整套丰富的接口函数来简化数据的交换,它能够存取JVM内部的数据库,提供从一种语言环境的数据类型到需要转换的语言环境的数据类型映射。
JNI也提供一些其他的支持结构以便于C和C++程序调用这些接口函数。不幸的是这些支持机制不能被汇编语言程序直接使用。所以汇编语言开发人员需要理解如何直接访问这些接口函数,要达到这个水平必须对JNI的结构有个全面的认识。
相关文章