-
Java调用C++编写的动态库(JNI)
2017-06-26 15:07:261.创建一个类,在类中加入带有native的方法(eclipse创建的类会自动添加class在bin目录下) 2.利用javah命令生成本地方法的c++头文件。进入到工程bin目录下,按住shift,并右击,选择 “在此处打开命令窗口”,...1. 在eclipse里利用java创建一个类,在类中加入带有native的方法(eclipse创建的类会自动添加class在bin目录下)
2.利用javah命令生成本地方法的c++头文件。进入到工程bin目录下,按住shift,并右击,选择 “在此处打开命令窗口”,进入命令窗口;输入 “javah -classpath . -jni 包名加上类名”,在bin目录下生成包名_类名.h头文件
注:
有些博客上写直接“javah 包名加上类名 ”就可以,但我在做的过程中他显示找不到相关的类文件,暂时还不知道怎么回事
-classpath 用于装入类的路径
-jni 表示生成jni的头文件
3. 利用VS生成动态库(新建项目,后续选择dll)
4. 拷贝jdk–>include中的jni.h,jni_md.h,和利用javah生成的头文件这三个头文件到vs生成的项目中,这是出现了错误,头文件是复制到本地文件的,不是库文件了,要将<>改为“”。
5. 利用C/C++编写实现本地方法。
实现后生成dll动态库。
6. 将dll动态库拷贝到工程下(也可放到其他地方,我选择的是工程目录下),设置一下:
7. 编写测试类及进行测试
很幸运成功了,在这个过程中暂时没有出现问题,以后用的过程中出现问题后再补充。
补充:
JNI:Java Native Interface,是java提供的一种通用接口,用于java代码与本地化代码交互。
本地化代码,就是直接编译成语机器相关的二进制代码 -
如何完成一个动态链接库,完成JNI调用实例
2013-05-15 14:37:471.前段时间,闲来无聊,想做个像QQ截图一样的截图工具,在却在做的过程中发现java自带API中的监听器带有很大的局限性,java的鼠标监听器只有在鼠标在程序窗口之上时才会生效,而键盘监听器则更加局限,只有在当前...1.前段时间,闲来无聊,想做个像QQ截图一样的截图工具,在却在做的过程中发现java自带API中的监听器带有很大的局限性,java的鼠标监听器只有在鼠标在程序窗口之上时才会生效,而键盘监听器则更加局限,只有在当前窗口为焦点窗口时才会生效,这显然是不符合我们需要效果的,我们所需要的是全局的键盘监听,不管你在干什么,只要触发我们设定的固定的组合键是,就会执行我们需要的功能,所以用java是不太好办。
2.那么QQ是怎么做到的呢?QQ是用C语言写的,并不是java,而且windows也是C语言写出来的,所以他能轻易的实现这种全局监听。这也就是一个突破口,native,不知道你有没有注意过这个关键字,这是用来调用本地代码的一个关键字。我们可以这样设想,假如我们将所有的代码全部用java实现,却用C语言去监听全局键盘,然后返回为我们所用。是不是很有意思。
3.下面我来说明这样用java代码调用C语言的方法(函数)。
- package test;
- public class HelloWorld{
- static{
- System.loadLibrary("HelloDll");
- }
- public static void main(String args[]){
- HelloWorld hw = new HelloWorld();
- hw.sayHello();
- }
- public native void sayHello();
- }
上面这个System.loadLibrary("HelloDll");此句为引入一个叫做HelloDll的本地文件,而这个必定包含了sayHello();的实现代码。java工作我们算是昨晚了,也就是一个简单的打印HelloWorld的代码,重要的是我们怎样用C语言去实现这个本地方法,怎样让其经行工作。
(1).编写java文件。上一步已经实现
(2).javac运行源文件生成class文件
(3).javah test.HelloWorld 这里注意不用上带后缀,我在经行这一步骤时,路径问题很麻烦。在包这一层运行javah test.HelloWorld就会生成一个叫test_HelloWorld.h的C语言头文件。
因为我们的方法是要用C语言实现的,所以经行到这一步,我们得到了一个C的头文件。如果你打开这个头文件,你会发现里面会有一个叫做JNIEXPORT void JNICALL Java_test_HelloWorld_sayHello(JNIEnv *, jobject);的方法,这个方法其实就是我们的java方法在C语言里边的映射了(我一般这么称呼,不知道对不对),我们只要将这个方法用C语言实现了,然后编译成一个java能调用的DLL本地文件就OK了。
(4)打开Microsoft Visual C++,File-->new-->Win32 Dynamic-Link Library,新建一个叫HelloDLL的文件动态链接工程,点击左下角FileView,点开HelloDll files。然后File-->new-->C/C++ Header File,名字为test_HelloWorld.h,然后点开Header Files里的test_HelloWorld.h,将我们刚才生成的test_HelloWorld.h文件内容复制进去,再File-->new-->C++ Source File,名字hello(随便取),然后点开文件写入内容:
- #include "test_HelloWorld.h"
- #include <iostream.h>
- JNIEXPORT void JNICALL Java_test_HelloWorld_sayHello
- (JNIEnv *, jobject){
- cout<<"HelloWorld"<<endl;
- }
可以看出,我们生成头文件的目的,无非就是为了用C语言实现,因为我们这里引入了这个头文件,而这里边唯一的一个方法,就是我们生成的头文件,也就是我们的java代码未实现的代码在C中的映射,然后我在这个方法中打印了HelloWorld这句话。(如果看不懂C代码,建议百度一下,就算看不懂,凭我文字描述应该也是能懂一些的,不过应该不会看不懂吧)。
另外就是,这一个段落我写的比较详细,甚至比较啰嗦,主要是为了没用过Microsoft Visual C++或者没学过C的人,能够手把手的教他运行这个程序,大神可以略过。
好了,言归正传,我们还需引入java的lib环境,Tools-->Options-->Directories在底下的方框栏中加入你C:\PROGRAM FILES\JAVA\JDK1.6.0_04\INCLUDE和C:\PROGRAMFILES\JAVA\JDK1.6.0_04\INCLUDE\WIN32也就是java的JDK的include和include中win32两个文件夹。然后Build-->Rebuild All。
你会发现,在你C++文件夹HelloDll中Debug中有一个HelloDll.dll文件。那么这个文件就是我们需要的动态链接文件了。如果你将它打开,那么你会发现大部分是乱码。
(5)将得到的HelloDll.dll复制到你的java工程的包这一层下,然后运行java test.eHelloWorld,就会打印HelloWorld这句话了,如果在没有这个dll文件时你就引进运行了,会抛出一个找不到动态链接文件的异常。
(6)这样我们就实现了用java调用C语言的方法了。这就是动态链接了,在下一篇我将描述,怎样用C语言的HHOOK钩子去获取windows底层键盘和鼠标的相应。
-
java源码包---java 源码 大量 实例
2013-04-18 23:15:26Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和... -
java源码包2
2013-04-20 11:28:17Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和... -
java源码包
2015-12-01 16:29:37Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和... -
java源码包3
2013-04-20 11:30:13Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和... -
java开源包1
2013-06-28 09:14:34JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
java开源包12
2013-06-28 10:14:45JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
Java资源包01
2016-08-31 09:16:25JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
java开源包101
2016-07-13 10:11:08JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
超爽的自学课件(java)
2007-09-16 16:04:04一般情况下,我们需要有意忽略一个对象的准确类型,让Java的动态绑定机制(多形性)为那一类型实现正确的行为。但在某些场合下,对于只有一个基础句柄的对象,我们仍然特别有必要了解它的准确类型是什么。拥有这个... -
java开源包11
2013-06-28 10:10:38JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
java开源包6
2013-06-28 09:48:32JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
java开源包10
2013-06-28 10:06:40JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
java开源包8
2013-06-28 09:55:26JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
java开源包9
2013-06-28 09:58:55JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
java开源包7
2013-06-28 09:52:16JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。... -
JAVA上百实例源码以及开源项目
2016-01-03 17:37:40Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和... -
JAVA上百实例源码以及开源项目源代码
2018-12-11 17:07:42在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天... -
Java开发技术大全(500个源代码).
2012-12-02 19:55:48HelloNative.java 准备调用C函数的java文件 HelloNative.lib 用VC编译生成的静态库文件 HelloNative.obj 用VB编译生成的目标文件 HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个... -
成百上千个Java 源码DEMO 4(1-4是独立压缩包)
2017-03-29 17:40:59在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天... -
成百上千个Java 源码DEMO 3(1-4是独立压缩包)
2017-03-29 17:39:54在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天... -
Java 编程经典 中文思想
2010-01-18 00:38:31一般情况下,我们需要有意忽略一个对象的准确类型,让Java的动态绑定机制(多形性)为那一类型实现正确的行为。但在某些场合下,对于只有一个基础句柄的对象,我们仍然特别有必要了解它的准确类型是什么。拥有这个... -
Java电子商城项目
2019-04-18 20:09:53图形可视化界面运行下能够显示系统启动进度条,删除、添加、注册等相关操作时能够弹出窗口加以提示,退出登录或系统时能够做到单击确认退出按钮才退出登录或系统,能够对用户加以提示。 注册用户或是管理员、添加... -
Java开发技术大全 电子版
2013-04-10 12:44:55第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释执行命令的使用10 1.2.5UltraEdit的使用11 1.3一个... -
《Java Web开发实战1200例(第I卷)》(清华出版.卢瀚.王春斌).part2 高清完整PDF版
2016-06-13 12:06:47实例094 图片的动态说明文字 第4章 JSP基础与内置对象 4.1 JSP的基本应用 实例095 自定义错误页面 实例096 导入版权信息 实例097 应用Java程序片段动态生成表格 实例098 应用Java程序片段动态生成下拉列表 ... -
asp.net知识库
2015-06-18 08:45:45完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) ... -
asp.net,java,jsp,安卓Android,苹果ios,php,vb.net,c#免费毕业课程设计源码打包下载
2015-01-29 22:29:54| Java调用Oracle存储过程实现分页功能.rar 1.96 MB | jsp人事工资管理系统.rar 433.81 KB | struts+hibernate实现的教务选课信息管理系统.rar 831.76 KB | vb.net基于winform三层代码生成器2.0版.rar 4.10 MB | ... -
JNA 实际开发中若干问题解决方法
2018-10-18 15:05:32JNA 实际开发中若干问题解决方法 ...而最近因为工作需要调用 Windows DLL 动态链接库(对应 Linux 中 so 文件),而对 JNA 有了入坑体验,对实际工作中遇到的问题做出总结。 1. 调用 Windows 窗口打印Hello Worl...JNA 实际开发中若干问题解决方法
很早就已经听说过 JNI(Java Native Interface)Java 本地接口,奈何调用本地动态链接库太过于复杂,就一直没有再尝试。而最近因为工作需要调用 Windows DLL 动态链接库(对应 Linux 中 so 文件),而对 JNA 有了入坑体验,对实际工作中遇到的问题做出总结。
1. 调用 Windows 窗口打印Hello World
>>>阅读全文
-
皮尔兹.rar电气设备选型资料大全 (适合刚刚入行的电气工程师对设备进行选型规划)详解 报价
-
数学建模国赛优秀论文一
-
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
-
VMware vSphere ESXi 7 精讲/VCSA/VSAN
-
智能停车场云平台(附vue+SpringBoot前后端项目源码)
-
图灵机是什么?一起来看看它的工作原理
-
三级网络技术知识点小礼包.pdf
-
SIMATIC_S7PLCSIM_V14_SP1.001
-
Tecplot 360 EX 2020 Release 2 User's Manual 用户手册
-
hbase--相关图例
-
工程大面向对象课程设计作品(完整)(也适用于软件工程大实验).7z
-
STM32F4-3-运行LVGL基础案例.rar
-
牛牛量化策略交易
-
DHCP 动态主机配置服务(在Linux环境下,配置单网段或跨网段提)
-
【Redis】Java操作Redis:StringRedisTemplate
-
华为1+X——网络系统建设与运维(高级)
-
【Python-随到随学】 FLask第一周
-
店铺无忧管理系统.V5版本的案例数据库
-
微服务注册中心Nacos入门
-
简历十大撒打算.docx