Jsp中调用DLL(使用JNI) 收藏
jsp调用jni方法
注:本文介绍Jsp中调用Dll动态链接库文件的方法,摘编自CSDN 炼狱的专栏
我的环境:
--------
1. java编译器:eclipse 3.0.2
2. web服务器: tomcat 4.1.24
3. C编译器: VC6.0
4. 操作系统: win2k
5. java源文件目录: d:\study\src
6. java编译后的class文件目录: d:\study\bin
7. tomcat目录: d:\tomcat41
1.编写java文件:
//Util.java
package com.jni;
public class Util
{
public native static int add( int x, int y );
static
{
System.loadLibrary( "Util" );
}
}
编译这个文件,生成Util.class文件.
2.生成对应的头文件:
打开一个dos窗口,进入存放class文件的目录:
d:\>cd d:\study\bin
d:\study\bin\>javah com.jni.Util
这样,会在d:\study\bin目录下生成com_jni_Util.h文件.
3. 编写c文件:
在VC6.0中:File->New->Projects->Win32 Dynamic-link Library,Project name 为Util, 创建一个empty DLL project.
把2所生成的com_jni_Util.h文件和C:\j2sdk1.4.2\include目录下的jni.h, C:\j2sdk1.4.2\include\win32目录下的jni_md.h复制到Util工程目录下.
(C:\j2sdk1.4.2为我的jsdk的安装路径).
在Util工程中创建一个c源文件,名为Util.c.
//Util.c
#include "com_jni_Util.h"
JNIEXPORT jint JNICALL Java_com_jni_Util_add
(JNIEnv *env, jclass jc, jint x, jint y)
{
return x+y;
}
4. 生成Util.dll:
编译3中的Util.c文件后,会生成Util.dll文件.
5. 生成jar包:
把Util.class文件打成jar包,名为myutil.jar.
6. 编写jsp文件:
//test.jsp
<%@ page import="com.jni.Util" %>
<html>
<head></head>
<body>
<h3>5+7=<%=Util.add( 5, 7 )%></h3>
</body>
</html>
7. 把myutil.jar包复制到d:\tomcat41\common\lib目录下;
把Util.dll文件复制到d:\tomcat41\bin目录下(也可以是环境变量path的所设定的任何一个目录下);
把test.jsp复制到d:\tomcat41\webapp\test目录下.
8. 启动tomcat.
9. 在ie中输入: http://localhost:8080/test/test.jsp.
如果你能看到: 5+7=12 就成功了.
================================================
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/softwave/archive/2007/02/01/1500259.aspx
JSP调用标准DLL附全部代码
--------------------------------------------------------------------------------
来源:CSDN 作者:慕遥 发布时间:2008-3-30 人气:210
今天用Java做了一个引用DLL的小例子。就是在DLL中用MessageBoxW显示一行字,然后用Java调用。
做的DLL名字叫JNI.DLL,放在了Tomcat的bin里(因为在JSP的bean中取当前路径显示就是这里)。然后在index.jsp里写上 <%@ page contentType="html/text ; charset=utf-8" import="Doudya.jni.jc"%>
<%
jc j = new jc();
out.println(Integer.toString(j.msg()));
%>
然后浏览,结果Tomcat果然弹出一个MessageBox……
正如我所预料的,JNI果然可以在JSP上使用。
这样一来就证明JSP可以调用标准DLL了,在服务器上的鼠标位置信息,屏蔽服务器上键盘和鼠标消息,用APi挂接Tomcat监视输入输出就都可以做到了。还可以做个监视服务器流量,在加载下一个网页的时候在当前页上显示真正的页面进度通通可以做到。
我也可以好好学C++了,用C++来做JSP的感觉一定很好啦。
又一个新的开始……
下面是全部代码。
所用到的工具有 Microsoft Vistual Studio 2008,Tomcat 1.6.16,JDK 1.6.04,EditPlus 3.00哈哈。
index.jsp*********************
<%@page contentType="text/html; charset=utf-8" import="Doudya.jni.jc"%>
<%
jc j = new jc();
out.println(Integer.toString(j.msg()));
%>
JNI.cpp***********************
#include <windows.h>
#include "E:\\website\\Doudya_jni_jc.h"
extern "C" JNIEXPORT jint JNICALL Java_Doudya_jni_jc_msg(JNIEnv* env,jobject jo){
wchar_t n[256];
jint k = 1987;
MessageBoxW(NULL,(_itow(k,n,10)),L"Java Native Interface Learnning",0);
return k;
}
jc.java***************************(javac -d E:\website\web\WEB-INF\classes jc.java -Xlint)
package Doudya.jni;
public class jc{
public native int msg();
public jc(){
System.loadLibrary("JNI");
}
public static void main(String[] args){
jc j = new jc();
int k = j.msg();
System.out.println("C++ return " + Integer.toString(k) + "\t you can smile");
}
}
Doudya_jni_jc.h***************************(javah Doudya.jni.jc)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Doudya_jni_jc */
#ifndef _Included_Doudya_jni_jc
#define _Included_Doudya_jni_jc
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Doudya_jni_jc
* Method: msg
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_Doudya_jni_jc_msg
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
==============***************2010-1-8 9:58:06*****************=====================================
Java Applet操纵本地扫描仪技术
————基于JDK1.3
交管局项目的软件
系统采用了基于Java的B/S结构,服务器端采用Unix操作系统、Oracle数据库,需要在客户端用扫描仪扫描图片后上传到服务器端的Oracle数据库中,考虑到B/S结构、基于Java等特点,操纵本地扫描仪最优的办法是采用Java Applet技术,具体技术实现如下:
一、 技术难点
Java Applet操纵本地扫描仪主要有以下的技术难点:
1. JDK Sandbox的限制:出于安全性考虑,普通的Java Applet的只能运行于JDK的Sandbox之中,不能访问本地文件系统,不能建立除它所在服务端之外的网络连接等等,要操纵本地扫描仪就需要突破这些限制。
2. Java语言本身的限制:Java是一种跨平台的语言,由于要考虑到跨多种操作系统的运行,所以它也就丧失了直接操纵本地硬件系统的特性,因而要在Java中操纵扫描仪只能通过JNI技术(即Java Native Interface),通过Java本地接口调用扫描仪驱动软件,完成扫描。
3. 其它技术难点:主要是涉及到Java数字签名技术,包括密钥对的生成和保存,证书文件的到如何到出,本地策略文件的配置,Jar文件的签署,证书的认证,软件的发布等等;采用Swing控件的Applet的网页的编写;服务器端和客户端文件的部署。
二、 问题的解决思路:
以上存在的技术难点需要逐一解决:
1. 突破JDK Sandbox的控制:首先需寻找方法,突破JDK Sandbox的控制,使Java Applet获得比较大以至全部的访问权限,可以访问本地文件系统,操纵本地硬件设备。
2. 解决Java操纵硬件设备的限制:需要通过查找资料,寻求一个相对来说比较简单的操纵扫描仪的方法。
三、 实际解决方法和采用的技术
1. 突破JDK Sandbox限制的解决方法:
通过查找资料和与其他人交流,找到突破JDK Sandbox限制的两个方法:
1)修改本地JRE(Java 2 Runtime Environment)策略文件java.policy,在其中加上一段代码:
grant codeBase"URL" {
permission java.security.AllPermission;
};
其中的URL是你要运行的Jar文件的地址,这样此Applet即可获得所有权限
2)采用数字签名Jar文件,使其获得相关的访问权限:具体实现如下:
Ø 生成密钥及密钥库:
keytool –genkey –keystore dragon.store –alias jizd
这个命令用来产生一个密匙库,执行完毕后应该在当前目录中产生一个dragon.store的文件,其中存放着一对密钥,这里的jizd是密钥所有者的名字
Ø 导出公有密钥成为一个X.509格式的证书:
keytool –export –keystore dragon.store –alias jizd –file dragon.cer
这个命令用来产生验证签名时所要用的证书。
Ø 用私有密钥签署Jar文件:
jarsigner -keystore dragon.store MyApplet.jar jizd
这个命令用上面产生的私有密钥将我们的jar文件进行了签名。
Ø 将证书中的公有密钥导入到客户密钥库中:
keytool –import –keystore guest.store –alias jizd –file dragon.cer
Ø 用Policytool生成运行此Applet的策略文件:
应该生成一个applet.policy策略文件,策略文件中着名了验证此前名Jar的密钥库的URL和公有密钥,以及此Applet应获得的权限。
Ø 修改客户端的${java.home}/jre/lib/security目录下的java.security文件:
在其中添加一行:
policy.url.3=URL/applet.policy
URL为存放Applet.policy的服务器路径。
具体配置时,最后一步可以通过编制一个小程序自动完成,前几步完成后将所有的文件在服务器端部署。
由于系统的网络自成体系,不会和Internet相连,所以不必要购买权威机构签发的软件开发许可证,用来签署Jar文件,采用以上的自签名的Jar即可,但是需要在客户端做一简单修改工作。
2. 解决Java操纵硬件设备的限制:由于JNI编程的复杂性,所以经过从网上寻找找到了一个Twain for Java的包,此包完成了