Java Native Interface(2)
プロパティの取得までは比較的簡単だったので、欲張ってデータを取ってきて保存するところまで作っちゃいました。
WmiCall.java
package wmi; public class WmiCall { static { System.loadLibrary("jniwmi"); classinit(); } public WmiCall() { } private static native void classinit(); public static native boolean init(); public static native void term(); public static native WmiResult access(String query, boolean withValue); public static native WmiResult link(String query, boolean withValue); }
WmiResult.java
package wmi; import java.util.Vector; public class WmiResult { private String[] properties; private Vector[] result; public WmiResult() { } public int getItems() { return properties.length; } public String[] getProperties() { return properties; } public String getProperty(int col) { return properties[col]; } public int getRows() { return result.length; } public Vector[] getResults() { return result; } public Vector getResultRow(int row) { return result[row]; } public Object getValue(int row, int col) { return result[row].get(col); } public Object getValue(int row, String col) { for (int i = 0; i < properties.length; i++) { if (col.equalsIgnoreCase(properties[i])) { return result[row].get(i); } } return null; } public String print() { StringBuffer image = new StringBuffer(); for (int j = 0; j < result.length; j++) { for (int i = 0; i < properties.length; i++) { image.append(""+j+"-"+i+" = "+properties[i]+" : "+result[j].get(i)+"\n"); } } return image.toString(); } }
それからテストプログラムとして、
WmiCallTest.java
package wmi.test; import wmi.WmiCall; import wmi.WmiResult; public class WmiCallTest { public WmiCallTest() { WmiCall wmi = new WmiCall(); wmi.init(); WmiResult op_sys = wmi.access("SELECT * FROM Win32_OperatingSystem", true); System.out.println(op_sys.print()); String drive = (String)op_sys.getValue(0, "SystemDrive"); WmiResult disk_part = wmi.access("SELECT * FROM Win32_DiskPartition", true); for (int row = 0; row < disk_part.getRows(); row++) { String part = (String)disk_part.getValue(row, "DeviceID"); String link_stmt = String.format("Win32_LogicalDiskToPartition.Antecedent=\"Win32_DiskPartition.DeviceID=\\\"%s\\\"\",Dependent=\"Win32_LogicalDisk.DeviceID=\\\"%s\\\"\"", part, drive); WmiResult log_disk = wmi.link(link_stmt, true); if (log_disk.getItems() > 0) { System.out.println(log_disk.print()); break; } } wmi.term(); } public static void main(String[] argv) { new WmiCallTest(); } }
getValueの部分でStringにキャストしてますが、今の時点では配列とかの取得までは行き着いていないのと、今後のデータ取得でIntegerとかLongも出てくる可能性があるので、戻りデータをObjectにしてます。