JNI技术,WindowsAPI初探——实现Java不能实现的功能

这篇文章是一篇原丢失博客上的旧文章,在此恢复。

最近在用Java做IDE(集成开发环境),需要读写磁盘底层,但是查资料后发现Java本身没有这个API,需要利用JNI技术来编写读写程序。因此JNI是因操作系统而异的,所以JNI技术本身无法跨平台。

使用JNI,首先需要在Java中动态加载外部库(Windows下就是dll,Linux下就是so)。我们使用:

接着,我们需要写一些方法,这些方法只有方法头,没有方法体,而方法体由C/C++来实现。

 

然后,我们需要生成一个头文件,需要使用javah命令。

在命令行中定位目录到编译成包含native方法的class文件的上一级目录(即与该class所在的包在同一级目录)。接着,执行:

 

在这里,jni是包名,DiskIO是包含native方法的类名。用专业的方法来说jni.DiskIO就是“完全限定名”。

执行完毕后便会生成一个头文件,我们来看看里面的内容:

 

可以看出,这里面包含有我刚刚定义的native方法头。

接着,我们需要编写真正的本地代码,由于我的目标是读写磁盘扇区,所以需要了解Windows API。

CreateFile——创建文件操作句柄;
SetFilePointer——设置文件操作指针;
ReadFile——读取文件到缓冲区;
CloseHandle——关闭文件句柄。

下面是一个读取扇区的例子,并且返回扇区内容的数组:

接着编译链接生成dll:

至此,就可以在Java中调用动态库了。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注