jni java 调用 dll 或vc窗口

简介: 引用:http://blog.csdn.net/ocelight/article/details/4412651 昨天和一部zzz一起研究解决一个java调用第三方dll的问题,从零开始学习了jni技术的应用,现在总结如下。

引用:http://blog.csdn.net/ocelight/article/details/4412651

昨天和一部zzz一起研究解决一个java调用第三方dll的问题,从零开始学习了jni技术的应用,现在总结如下。

       事情的起因是一部的一个项目需要用到一个爱国者提供的基于U盘的加密技术。对方提供了U盘和一个dll动态链接库hiddenIO.dll。在U盘的隐藏区域内可以储存USB-Key信息,通过这个dll里的两个方法可以使用c/c++编写程序在U盘的隐藏区域读写信息,对方提供了示例代码。由于一部的项目是基于SWT/RCP技术的,所以需要在java程序中调用这两个方法。

 

 

 


       目前java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows/linux系统中,实现java与native method互调)。目前只能由c/c++实现。后两个都是sourceforge上的开源项目,同时也都是基于jni技术的windows系统上的一个应用库。Jacob(Java-Com Bridge)提供了java程序调用microsoft的com对象中的方法的能力。而除了com对象外,jawin(Java/Win32 integration project)还可以win32-dll动态链接库中的方法。就功能而言:jni >> jawin>jacob,其大致的结构如下图:

 

 

 

 

jni技术体系功能结构图

 

就易用性而言,正好相反:jacob>jawin>>jni。

Jvm封装了各种操作系统实际的差异性的同时,提供了jni技术,使得开发者可以通过java程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过jni提供的相应原生接口开调用java应用系统内部实现的功能。

在windows系统上,一般可执行的应用程序都是基于native的PE结构,windows上的jvm也是基于native结构实现的。Java应用体系都是构建于jvm之上。

 

 

 

Windows系统上的java体系

 

Jni对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使用c/c++来实现一个代理程序(jni程序)来实际操作目标原生函数,java程序中则是jvm通过加载并调用此jni程序来间接地调用目标原生函数。

 

 

Jni调用过程示意图

 

 

 

 

 

Jni程序开发的一般操作步骤如下:

l         编写java中的调用类

l         用javah生成c/c++原生函数的头文件

l         c/c++中调用需要的其他函数功能,实现原生函数(原则上可以调用任何资源)

l         将项目依赖的所有原生库和资源加入到java项目的java.library.path

l         生成java程序

l         发布java应用和dll库

 

 

 

Jni程序开发示例:

1、  在eclipse项目中新建一个TestHello.java,输入以下内容:

public class TestHello {

 

  static {

     System.loadLibrary("TestHello");

  }

 

  public static 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中生成的TestHello.h文件复制到此目录。点击左边中间的FileView,切换到文件浏览模式。在Header Files上点击右键,选择Add Files to Folder…。

选择TestHello.h文件,点击OK。

 

 

 

 

打开StdAfx.h文件,再最后面添加:

#include <jni.h>

#include "TestHello.h"

 

 

 

打开TestHello.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); 

 

}

 

 

 

 

在VC的菜单上选择Tools-Options…,打开选项对话框。在Directories文件夹,添加上jdk所在文件夹下的include和include/win32文件夹。

 

 

 

 

 

点击VC上的菜单项Build-Build All,生成TestHello.dll。

4、  将VC项目Debug文件夹中的TestHello.dll复制到TestHello.class所在的文件夹下。

5、  在命令行下输入java TestHello,弹出MessageBox对话框。调用win32 api成功。

 

 

 

相关文章
|
9天前
|
Java 测试技术 定位技术
《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
【4月更文挑战第15天】本文介绍了如何使用Selenium进行浏览器窗口切换以操作不同页面元素。首先,获取浏览器窗口句柄有两种方法:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口句柄。在项目实战部分,给出了一个示例,展示了在百度首页、新闻页面和地图页面之间切换并输入文字的操作。最后,文章还探讨了在某些情况下可能出现的问题,并提供了一个简单的本地HTML页面示例来演示窗口切换的正确操作。
37 0
|
24天前
|
Java 开发工具 计算机视觉
Caused by: java.lang.UnsatisfiedLinkError: Can‘t load AMD 64-bit .dll on a IA 32-bit platform【已解决】
Caused by: java.lang.UnsatisfiedLinkError: Can‘t load AMD 64-bit .dll on a IA 32-bit platform【已解决】
4 0
|
8月前
|
Java Android开发
Android JNI开发从0到1,java调C,C调Java,保姆级教程详解
Android JNI开发从0到1,java调C,C调Java,保姆级教程详解
64 1
|
10月前
|
Java
java -jar 命令隐藏黑窗口
java -jar 命令隐藏黑窗口
247 0
|
6月前
|
Java
【Java异常】ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit erro
【Java异常】ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit erro
76 0
|
9月前
|
Java Android开发 C++
[Android JNI] --- 静态注册和动态注册实现java和native相互调用
[Android JNI] --- 静态注册和动态注册实现java和native相互调用
113 0
|
9月前
|
XML Java 编译器
[Android JNI] --- Java和Android简介
[Android JNI] --- Java和Android简介
83 1
|
10月前
|
算法 Java C语言
java调用JNI总结
java调用JNI总结
|
10月前
|
安全 Java C++
Java本地方法/Java native方法/JNI
Java本地方法/Java native方法/JNI
140 0
|
10月前
|
Java 编译器 图形学
我把皮小浪の的 蓝色妖姬系列做进了java窗口
我把皮小浪の的 蓝色妖姬系列做进了java窗口
108 0