在上一篇文章中我们提到如何使用jni在windows环境中读取硬盘序列号。然而,原有的代码,并不能有效地读取sata硬盘信息,并且在x64环境下也不能工作。所以,我们需要一种新的读取硬盘序列号的方法。
最终,经过笔者寻找,发现终于有一个有效地同时能够读取sata硬盘的c++代码,该代码的源地址为:
http://www.winsim.com/diskid32/diskid32.cpp
此代码能够在x86以及x64位平台下很好地工作。当然,仅是一段读取硬盘信息的代码,此处有详细的使用代码。可以下载以使用。
那么,在java中, 我们可以使用这段代码,分别编译出两个版本的dll文件,一个定义为acx86.dll,另一个定义为acx64.dll。这样在项目启动时,我们就可以根据当前jvm的版本(为什么不是windows版本,而是jvm版本,自己想),来选择加载不同的dll。那么,如何判断当前jvm版本呢,以下代码可以达到:
public static boolean isJvm32() { return System.getProperty("sun.arch.data.model").contains("32"); }
属性值sun.arch.data.model,当在32位jvm时,将返回32; 而在64位jvm时,返回64。这样就可以分别加载不同的dll了。
以上代码(包括c++和java)均已在本机测试通过(windows xp x64版本,jdk32位和64位)。