用JAVA语言怎么控制和使用计算机硬件 Java Communications APIhttp://java.sun.com/products/javacomm/ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 通过JNI技术, 让Java调用DLL(UNIX平台SO)中的功能函数 你要控制什么硬件?Java对硬件的访问可以使用Java对本地语言(主要是C/C++,Python也可以)的接口--JNI。另外有现成的库 JConfig 你可以试一试。 Java Communications APIhttp://java.sun.com/products/javacomm/我用过 Java以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决Java对本地操作的一种方法就是JNI。在有的时候我们不可以避免地进行本地操作,最常见的就是Java想访问Window本地的资源,比如想调节鼠标移动速度、改变窗体底色等等,下面就用例子来说明最简单的JNI调用。 Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使Java可以实现和本地机器的紧密联系,调用系统级的各接口方法。在本例中,首先写一个HelloWorld.java,注意这段代码出现了native关键字,可以把这段代码看成是调用本地库的桥。然后使java HelloWorld.java生成HelloWorld.class。接着生成C的头文件,这可以用jdk提供的javah命令:javah HelloWorldclass,成功运行后会出现HelloWorld.h,再编写C文件并编译成DLL, 文件名随便取,主要扩展名.c就可以,比如在本例中取名为Try.c,最后,DLL的文件名当然要是hello.dll,因为前面调入本地库时用的是System.loadLibrary("hello");。 运行java HelloWorld屏幕会打印Hello world!而且伴着Beep一声。 程序的完整代码如下所示:1.HelloWorld.javaclass HelloWorld { public native void displayHelloWorld();//定义本地方法 static { System.loadLibrary("hello");//调入本地库 } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); }}2. Try.c#include <jni.h>#include "HelloWorld.h"#include <stdio.h>#include <windows.h>JNIEXPORT void JNICALLJava_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){ printf("Hello world!\n");//在这里实现java类中定义的方法 MessageBeep(0);//调用到win本地,会发一声响 return;} 上面的例子提供了一种方法,通过这种方法我们就可以在Java中发挥C在Windows中的许多功能了,也就是说这里提供的是一道门,通过这道门之后具体要实现什么就要看读者想要用C实现什么了。 使用C/C++很容易编程获取硬件信息,而Java可以通过JNI调用本地方法,这就给我们提供了一种比较容易的实现方法;另一种方法就是直接用Java编程实现,这需要相关类的支持,一本好的类库参考手册会帮读者大忙的。在本节中我们只举一个简单的小例子说明如何获得本机的Mac地址。 关键是使用了相关类。 运行后就像在命令行下直接使用ipconfig /all一样显示出相关信息。 程序的完整代码如下所示:import java.io.*;import java.net.URL;public class MacAddressHelper { public MacAddressHelper() { } private static String getMyMac() { String s = ""; try { String s1 = "ipconfig /all"; Process process = Runtime.getRuntime().exec(s1); BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = bufferedreader.readLine(); for(;line != null;) { String nextLine = bufferedreader.readLine(); if(line.indexOf("Physical Address") > 0){ int i = line.indexOf("Physical Address") + 36; s = line.substring(i); break; } line = nextLine; } bufferedreader.close(); process.waitFor(); } catch(Exception exception) { s = ""; } return s.trim(); } public static void main(String[] args){ System.out.println(MacAddressHelper.getMyMac()); }} 于硬件进行交互并不是Java的强项,然而有时候我们有需要获得相关信息,对于熟悉C/C++的程序员,可以考虑使用JNI。方法是很多的,关键是读者要发挥想象力,把各种学过的基础方法联系起来综合应用,这是需要大量的编程实践和不断的思考才能做到的。 为何我的快速排序如此龟速? 请教个关于自动折行的算法 关于用jxl操作excel表的问题请教 JOptionPane的问题 关于String类“+”运算的问题 求JSP?? 界面设计 为什么在编译的时候出现cannot resolve symbol错误??等待ing 关于LightningBoard(雷霆论坛)的几点说明。 初学者,有几个问题 编译无法通过,为什么? rmi存根问题
我用过
Java通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使Java可以实现和本地机器的紧密联系,调用系统级的各接口方法。在本例中,首先写一个HelloWorld.java,注意这段代码出现了native关键字,可以把这段代码看成是调用本地库的桥。然后使java HelloWorld.java生成HelloWorld.class。接着生成C的头文件,这可以用jdk提供的javah命令:javah HelloWorldclass,成功运行后会出现HelloWorld.h,再编写C文件并编译成DLL, 文件名随便取,主要扩展名.c就可以,比如在本例中取名为Try.c,最后,DLL的文件名当然要是hello.dll,因为前面调入本地库时用的是System.loadLibrary("hello");。
运行java HelloWorld屏幕会打印Hello world!而且伴着Beep一声。
程序的完整代码如下所示:
1.HelloWorld.java
class HelloWorld {
public native void displayHelloWorld();//定义本地方法
static {
System.loadLibrary("hello");//调入本地库
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
2. Try.c
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
#include <windows.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
printf("Hello world!\n");//在这里实现java类中定义的方法
MessageBeep(0);//调用到win本地,会发一声响
return;
}
上面的例子提供了一种方法,通过这种方法我们就可以在Java中发挥C在Windows中的许多功能了,也就是说这里提供的是一道门,通过这道门之后具体要实现什么就要看读者想要用C实现什么了。
关键是使用了相关类。
运行后就像在命令行下直接使用ipconfig /all一样显示出相关信息。
程序的完整代码如下所示:
import java.io.*;
import java.net.URL;
public class MacAddressHelper {
public MacAddressHelper() {
}
private static String getMyMac() {
String s = "";
try {
String s1 = "ipconfig /all";
Process process = Runtime.getRuntime().exec(s1);
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = bufferedreader.readLine();
for(;line != null;) {
String nextLine = bufferedreader.readLine();
if(line.indexOf("Physical Address") > 0){
int i = line.indexOf("Physical Address") + 36;
s = line.substring(i);
break;
}
line = nextLine;
}
bufferedreader.close();
process.waitFor();
} catch(Exception exception) {
s = "";
}
return s.trim();
}
public static void main(String[] args){
System.out.println(MacAddressHelper.getMyMac());
}
}
于硬件进行交互并不是Java的强项,然而有时候我们有需要获得相关信息,对于熟悉C/C++的程序员,可以考虑使用JNI。方法是很多的,关键是读者要发挥想象力,把各种学过的基础方法联系起来综合应用,这是需要大量的编程实践和不断的思考才能做到的。