博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java程序与操作系统API的关系
阅读量:4030 次
发布时间:2019-05-24

本文共 2074 字,大约阅读时间需要 6 分钟。

java程序与操作系统API的关系
    操作系统会将涉及到系统级别的功能的接口暴露出来给应用层调用,比如window下的c/c++/c#编程,可以调用系统的库函数。然而对于java程序,他是不能直接调用系统API的!!!
因为java程序是“跨平台”,不能直接与OS耦合,因此也不能直接调用系统API。
    那么问题来了:
1.java程序是怎么使用系统的底层功能的呢?比如做一些线程调度、socket连接?
    java程序不跟系统直接打交道,但不代表着不能使用系统,毕竟OS层是所有程序都不能跨越的。java其实是面相JVM编程的!JVM才负责调用这个JVM所依赖的系统的底层API的!所以会有不同平台的JAVA虚拟机!这也是JAVA代码能够跨平台的根本原因所在!
2.如果我一定要让我的java程序调用操作系统API以及使用DLL呢?
    之前一直觉得Java不能调用系统API就是一个莫大的遗憾,后来发现还真可以的!
    如果你会会C++当然最好,学习Java的都知道,Java是跨平台的语言,需要虚拟机,Java是无法直接访问操作系统API的,这样在某些需求下就会受到限制,比如。我现在想关闭显示器,或锁定鼠标键盘,或获取系统信息,获取浏览器URL,获取播放器来播放多媒体等等,我们会发现Java貌似无法做到,
那么我们如何用Java来操作系统API或调用DLL动态链接库呢?答案肯定是有的,他们就是JNA与JNI技术。
    
什么是JNI?全称Java Native Interface,即Java本地接口,它提供一套能与其它语言通信的API,主要是C(C++),其使用步奏如下:
 
什么是JNA? 全称Java Native Access,使用JNA比JNI简单许多,我们只需要在Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,调用起来感觉就像在调用Java代码一样方便。使用JNA需要两个架包,即jna-4.1.0.jar与jna-platform-4.1.0.jar,这样就行了。
以下代码将演示如何用JNA技术来调用User32 API来阻塞鼠标键盘的控制,并且开始闪屏,闪烁十次后退出,哈哈
import com.sun.jna.Native;import com.sun.jna.win32.StdCallLibrary;public class Test{ public interface User32 extends StdCallLibrary {  User32 INSTANCE = (User32)Native.loadLibrary("User32",User32.class);
//加载系统User32 DLL文件,也可以是C++写的DLL文件  int SendMessageA(int hwnd,int msg,int wparam,int lparam);  int FindWindowA(String arg0,String arg1);  void BlockInput(boolean isBlock);  int MessageBoxA(int hWnd,String lpText,int lpCaption,int uType); }
public static void main(String[] args) throws Exception {  int hwnd = User32.INSTANCE.FindWindowA(null, null);  System.setProperty("jna.encoding","GBK");//设置编码,防止乱码  User32.INSTANCE.MessageBoxA(hwnd, "看我闪瞎你的狗眼", 0, 0);//调用消息对话框  int i = 0;  while(true){   User32.INSTANCE.BlockInput(true);//阻塞鼠标键盘的输入   User32.INSTANCE.SendMessageA(hwnd, 0x0112, 0xF170, 2);//关闭显示器   Thread.sleep(2000);//间隔2秒   User32.INSTANCE.SendMessageA(hwnd, 0x0112, 0xF170, -1);//打开显示器   Thread.sleep(2000);//间隔2秒   i++;   if(i>10){    break;   }  }  User32.INSTANCE.BlockInput(false);//释放鼠标键盘 }}
如果把键盘鼠标阻塞加入到死循环,那么,呵呵。。。。强制重启吧。。。。
有了以上知识,即可以任意调用系统API了,这里只是一个简单的介绍与一个很简单的列子,如需深入研究的话,你会发现里面还涉及到一些数据的转换,结构体的映射等等,有兴趣的就研究研究吧。。。。
你可能感兴趣的文章
coursesa课程 Python 3 programming Dictionary methods 字典的方法
查看>>
Returning a value from a function
查看>>
coursesa课程 Python 3 programming Functions can call other functions 函数调用另一个函数
查看>>
coursesa课程 Python 3 programming The while Statement
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
visca接口转RS-232C接口线序
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
终于搞定CString和string之间转换的问题了
查看>>
用防火墙自动拦截攻击IP
查看>>
补充自动屏蔽攻击ip
查看>>
谷歌走了
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>