大家知道,Java调用DLL有个特别的地方,就是DLL的输出函数需要特别的名字:
JNIEXPORT void JNICALL Java_类名_函数名
  (JNIEnv *, jclass, 其他参数)

{

}

总是要求DLL函数有 Java_ 开头,调用USER32.DLL中的 GetWindowText 那要怎么做呢?直接调用是不可能的了,下面介绍通过桥接器,实现Java调用任何API,或者类似API的任何DLL的方法。

先看运行效果:

这是把 JFrame 通过 API 中的 SetWindowRgn 函数改变成圆角窗口。

这个桥接器的准备工作可以参考VC写的源代码。这里主要介绍的是Java部分的代码:

1 API 部分

public class MyAPI{ public static dobject4j os_api=new dobject4j("OSAPI"); public static dValue GetWindowText(dValue hWnd){ dobject4j param=new dobject4j("ApiParams"); param.invoke("AppendHandlePointer",hWnd); param.invoke("AllocAsciiStringBuffer",new dValue(260)); param.invoke("AppendUnsignedLong",new dValue(260)); os_api.invoke("CallOSAPI",new dValue("USER32.DLL"),new dValue("GetWindowTextA"),new dValue(param)); return param.invoke("ReadAsciiString",new dValue(4)); } public static dValue SetWindowRgn(dValue hWnd,dValue hRgn,dValue bRedraw){ dobject4j param=new dobject4j("ApiParams"); param.invoke("AppendHandlePointer",hWnd); param.invoke("AppendHandlePointer",hRgn); param.invoke("AppendUnsignedLong",bRedraw); dValue ret=os_api.invoke("CallOSAPI",new dValue("USER32.DLL"),new dValue("SetWindowRgn"),new dValue(param)); param=null; return ret; } //其他API的代码可以下载后看看。下载的.dwidget文件是zip格式的,改名.zip解压后即可。 }

2 应用实现部分

public void StartupMe(){ frame=new JFrame("Swing Application"); ................ createComponents(frame); frame.setLocation(300,220); frame.setSize(300,130); String title="round JFrame"; frame.setTitle(title); frame.setVisible(true); ................ dValue desktop=MyAPI.GetDesktopWindow(); dValue h=MyAPI.FindWindowEx(desktop,null,new dValue("javax.swing.JFrame"),new dValue(title)); dValue hParentRgn=MyAPI.CreateRoundRectRgn(new dValue(13),new dValue(3), new dValue(290),new dValue(120),new dValue(15),new dValue(15)); MyAPI.SetWindowRgn(h,hParentRgn,new dValue(true)); MyAPI.DeleteObject(hParentRgn); }

桥接器的2个重要的类分别是 OSAPI 和 ApiParams。OSAPI 负责API的调用实现,ApiParams 负责参数组织。OSAPI 的 CallOSAPI 方法 第一个参数是DLL文件名,像上述的USER32.DLL,第二个参数是方法的名字,要注意的是,Windows API 很多是区分 ANSI 和 Unicode ,就像我们熟悉的GetWindowText() 就分别有GetWindowTextA() 和GetWindowTextW() 两个对应于 ANSI 和 Unicode ,第三个参数是API的参数。ApiParams 的方法有很多,都是支持各种类型参数用的,例如 AppendUnsignedLong() 方法支持 DWORD 类型,AppendHandlePointer() 支持各种句柄。ApiParams还可以嵌套,用 AppendStructurePointer() 方法支持嵌套结构体指针,用 AppendStructure()  方法支持嵌套结构体,等等。

点击这里仅下载本例代码,下载后的.dwidget改名.zip文件解压即可

点击这里下载整个运行程序

点击这里下载这个IE内核浏览器源代码(不含msscript.ocx调用机制部分源代码,这部分是DLL形式提供的)

yesry 通过桥接器,Java调用任何API或DLL相关推荐

  1. java 调用win32 api 学习总结

    java使用JInvoke调用windows API 使用jinvoke调用windowsAPI.jna使用比较麻烦,需要写c代码和参数转换,jinvoke的使用就像jdk中的包一样. 官网使用参考: ...

  2. Java调用 新浪微博API 接口发微博(包含js微博组件、springMVC新浪登录)详解

    参考自:http://www.myexception.cn/program/1930025.html https://blog.csdn.net/qq_36580777/article/details ...

  3. Java调用百度API实现图像识别

    Java调用百度API实现图像识别 最近在做一个关于识别的小功能,翻阅了一堆资料,也实践自己去实现这个功能,最后识别的结果不是那么理想.这里介绍一个完全可以商用以及识别率超高的百度ai接口 1.为什么 ...

  4. Java调用百度API生成短网址

    由于百度短网址旧API更新,故更新下原博客内容(仅供参考),希望小伙伴们以官方API为主,以防影响使用. 官方API:https://dwz.cn/console/apidoc package com ...

  5. Java调用百度API出现{status:211,message:APP SN校验失败}

    Java调用百度API出现{"status":211,"message":"APP SN校验失败"} {"status" ...

  6. JAVA 调用微信API 生成小程序跳转地址 亲测有效 【附效果图】

    JAVA 调用微信API 生成小程序跳转地址 JAVA 调用微信API 生成小程序跳转地址 由于工作需要,需要在后台生成自己公司的小程序分享地址以供前端工作人员使用,在开发当前功能时因为遇到一些问题导 ...

  7. Java调用 新浪微博API 接口发微博,逐条讲解,绝对清晰

    最近要做个课程设计,使用微博控制树莓派,树莓派再控制发光二极管的亮和灭,主要设计分两层,上层是用Java调用新浪微博API来实现对微博旳监听,当我的微博被回复时能够自动读取评论内容,并根据评论的指令内 ...

  8. Java调用 新浪微博API 接口发微博,逐项讲解,绝对清晰

    转载自:http://www.myexception.cn/program/1930025.html Java调用 新浪微博API 接口发微博,逐条讲解,绝对清晰 最近要做个课程设计,使用微博控制树莓 ...

  9. java 调用微信api发送消息

    要在 Java 中调用微信 API 发送消息,你需要做的第一步是在微信公众平台中注册自己的公众号,然后获取到自己的 AppID 和 AppSecret. 然后你可以使用微信公众平台提供的开发文档,来了 ...

最新文章

  1. XML的介绍和PHP对XML的应用
  2. docker run redis
  3. kafka创建topic_Kafka实战宝典:一文带解决Kafka常见故障处理
  4. python--while循环
  5. 说出来你可能不信,谷歌一年要给苹果交200亿保护费。
  6. 摆脱设备操作桎梏 汉锐股份教育录播系统解密
  7. 计算机视觉实战(八)直方图与傅里叶变换
  8. js事件(事件冒泡与事件捕获)
  9. Atitit WatchService 使用和不能监控抓取到的解决 原因是生成速度太快,但处理速度慢,导致许多event 忽视了.. How to solu??? asyn to process
  10. php使用获取mysqlerror时报错Call to undefined function mysql_error()
  11. 5G NR协议栈及功能2 - MAC RLC PDCP SDAP
  12. 白领沉迷EXCEL式生存
  13. 中国石油大学(北京)-《中国近现代史纲要》第二阶段在线作业
  14. IC数字芯片学习各类公众号汇总
  15. 【verilog学习23】HDLBits:Circuits_Sequential Logic_Finite State Machines
  16. 想开发手机APP软件,首先要弄清楚以下10点
  17. 疯狂的长租公寓:自如、蛋壳们2020的生死决战
  18. 19.1 NESMA 唯一和非唯一搜索条件的组合 案例研究
  19. CCleaner V2.12.660 极度精简单文件版
  20. 立体多层玫瑰绘图源码__玫瑰花python 绘图源码集锦

热门文章

  1. 【ABviewer从零开始教学查看器篇①】3D查看器和3D剖面板
  2. 学号20189220 2018-2019-2 《密码与安全新技术专题》第五周作业
  3. AndroidStudio Plugin插件开发
  4. char s[],char *s,char **s与char *s[]
  5. Envoy proxy 源代码解读 - original_dst cluster
  6. CouchDB操作手册
  7. IE浏览器主页更改问题(在浏览器Internet的属性里怎么也修改不成功)
  8. 大学计算机期末总结范文,大学计算机课期末总结.doc
  9. cad中直径符号不显示_怎么在CAD、Word里敲出直径符号,你会吗?
  10. 火车站信号自动语音播报系统的设计