JNI技术实践小结

上传人:daj****de 文档编号:168659226 上传时间:2022-11-11 格式:DOCX 页数:9 大小:391.16KB
收藏 版权申诉 举报 下载
JNI技术实践小结_第1页
第1页 / 共9页
JNI技术实践小结_第2页
第2页 / 共9页
JNI技术实践小结_第3页
第3页 / 共9页
资源描述:

《JNI技术实践小结》由会员分享,可在线阅读,更多相关《JNI技术实践小结(9页珍藏版)》请在装配图网上搜索。

1、JNI 技术实践小结xx 组 kimmking2008年11 月12日昨天和一部 zzz 一起研究解决一个 java 调用第三方 dll 的问题,从零开始学 习了 jni技术的应用,现在总结如下。事情的起因是一部的一个项目需要用到一个爱国者提供的基于U盘的加密 技术。对方提供了 U盘和一个dll动态链接库hiddenlO.dl 1。在U盘的隐藏区域 内可以储存USB-Key信息,通过这个dll里的两个方法可以使用c/c+编写程序 在U盘的隐藏区域读写信息,对方提供了示例代码。由于一部的项目是基于 SWT/RCP技术的,所以需要在java程序中调用这两个方法。目前java与dll交互的技术主要有

2、3种:jni, jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windowslinux 系统中,实现java与native method互调)。目前只能由c/c+实现。后两个都是 sourceforge上的开源项目,同时也都是基于jni技术的windows系统上的一个应 用库。Jacob ( Java-Com Bridge)提供了 java程序调用microsoft的com对象中的 方法的能力。而除了 com 对象外,jawin (java/Win32 integration projeCt还可以 win32-

3、dll动态链接库中的方法。就功能而言:jni jawinjacob,其大致的结构 如下图:jni技术体系功能结构图就易用性而言,正好相反:jacobjawinjni。Jvm封装了各种操作系统实际的差异性的同时,提供了 jni技术,使得开发 者可以通过java程序(代码)调用到操作系统相关的技术实现的库函数,从而 与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统 也可以通过jni提供的相应原生接口开调用java应用系统内部实现的功能。在windows系统上,一般可执行的应用程序都是基于native的PE结构, windows上的jvm也是基于native结构实现的。Java

4、应用体系都是构建于jvm之 上。WindowsnativemethodJVMjre/jdkJavac/c+dll/com jmapplicatio nsmodulesWindows 系统上的 java 体系Jni对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使 用C/C+来实现一个代理程序(jni程序)来实际操作目标原生函数,java程序中 则是jvm通过加载并调用此jni程序来间接地调用目标原生函数。jn i-stub Load Stub Call Stub methodjava-class Load DLL Call nativemethod 丿 invoke returnv

5、aluesJni调用过程示意图Jni程序开发的一般操作步骤如下: 编写java中的调用类 用javah生成c/c+原生函数的头文件 C/C+中调用需要的其他函数功能,实现原生函数(原则上可以调用任何资 源) 将项目依赖的所有原生库和资源加入到java项目的java.library.path 生成 java 程序 发布 java 应用和 dll 库Jni程序开发示例:1、在eclipse项目中新建一个TestHello.java,输入以下内容:public class TestHello static System. loadLibrary (TestHello );public static

6、native void hello(String msg);public static void main(String args) hello (Hello,Kimm! );编译生成 TestHello.class 文件。2、在命令行下使用javah TestHello命令,生成TestHello.h头文件(就是jni代 理 stub 的接口)。3、在 VC6 中新建一个项目 TestHello,项目类型为 Win32 Dynamic-Link Library。 点击 OK。在弹出的窗口中选择A simple DLL project,点击Finish。打开项目所在的文件目录,将步骤2中生成的

7、TestHello.h文件复制到此目录。 点击左边中间的FileView,切换到文件浏览模式。在Header Files上点击右键, 选择 Add Files to Folder选择TestHello.h文件,点击OK。打开 StdAfx.h 文件,再最后面添加:#include #include TestHello.h/ Insert your headers here ttdeFine WIN32 LEAN AND MEANttinclude ttinclude ttinclude TestHello .h| / TODO: reference additional hi打开 TestHe

8、llo.cpp 文件,在最后面添加一段代码:JNIEXPORT void JNICALL Java_TestHello_hello(JNIEnv * env, jclass obj, jstring jMsg)const char *strMsgPtr = env-GetStringUTFChars( jMsg , 0);MessageBox( 0, strMsgPtr,Message box from VC+ , 0 );env-ReleaseStringUTFChars( jMsg, strMsgPtr);JNIEXPORT uoid JNICALL Jaua_TestHello_hell

9、o(JNIEnu * enu, jclass obj, jstring jMsg) const char *strMsgPtr = enu-GetStringUTFChars( jMsg , O);MessageBox( 0, strMsgPtr/Message box From UC+ , 0 ); enu-ReleaseStringUTFChars( jMsg, strMsgPtr);1在VC的菜单上选择Tools-Options打开选项对话框。在Directories文件 夹,添加上 jdk 所在文件夹下的 include 和 includewin32 文件夹。点击 VC 上的菜单项 Build-Build All,生成 TestHello.dll。4、将 VC 项目 Debug 文件夹中的 TestHello.dll 复制到 TestHello.class 所在的文 件夹下。5、在命令行下输入java TestHello,弹出MessageBox对话框。调用Win32 api 成功。确圭LdHello, Kimm!c* C:INDOSsyste32cd. eze 一 java TestHellott): cusjnibinjaua TestHelloIessage box fro VC+ X

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!