javascript 與applet的通訊 和java與c(dll文件)通訊,最終在b/s架構下實現與硬件(讀卡器)通訊
在b/s架構下怎樣實現客戶端的硬件(讀卡器)設備通訊,得到硬件(讀卡器)的數據。在此與硬件設備通訊的C或其它的通訊設備語言是由
商提供的。我只負責實現javascript與applet通訊和jni與c通訊.在此我們要解決的問題是:
1)javascript和applet怎樣通訊?
2)java怎樣調用c來實現和硬件通訊?
3)由于applet的安全級別非常的高,那么怎樣實現安全認證或數字簽名?
4)由于在B/S架構下程序一般放在服務器端,那么怎樣來實現對客戶端的硬件(讀卡器)操作呢?
用一個實現實例來說明上述問題:
1)寫一個java程序利用jni來調用用c產生的dll(動態連接庫)如下HelloWorld.java

public class HelloWorld {
public native void displayHelloWorld();//注意關鍵字native,這就說明這個方法是用本地方法實現的。
public native String getUserName();//從(本地文件)c 程序中返回一個值

static {//靜態代碼段里面導入了hello.dll。
System.loadLibrary("hello");//加載一個動態連接(dll)文件,在調用時它用最早的調用到內存中
//System.load("D:\\Tomcat 5.0\\webapps\\test\\jar\\hello");//能過指定的絕對路徑來加載
}

/**//*
*構造方法
*/

public HelloWorld(){
}

public static void main(String[] args) {//調用本類的displayHelloWorld方法,(當然了方法實際上是用c語言實現的)
//new HelloWorld().displayHelloWorld();
String s = new HelloWorld().getUserName();
System.out.println("successful "+s);
//System.out.println(s.length());
}
}

2)用javac編譯HelloWorld
3)用javah產生HelloWorld.h文件。它好比java中的一個接口。

/**//* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>

/**//* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus

extern "C" {
#endif

/**//*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);


/**//*
* Class: HelloWorld
* Method: getUserName
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_HelloWorld_getUserName
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


4)編寫一個*.c(HelloWorldImp.c)的文件。它好比一個接口的實現。
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)

{
printf("Hello world!\n");//這個例子中只輸出一行Hello World!
// return;
}


JNIEXPORT jstring JNICALL Java_HelloWorld_getUserName (JNIEnv *env, jobject obj){
jstring jstr;
char str[]=" Rami very good! yes!\n";
jstr = (*env)->NewStringUTF(env,str);
//printf(str);
return jstr;

}


5) 編寫一個applet程序來調用HelloWord。Applet1.java
import java.applet.Applet;
import java.awt.*;




public class Applet1 extends Applet {

/** *//**
* @param args the command line arguments
*/
public String UserName="applet call jni";


public void init(){

try{
System.out.println("test");
//new HelloWorld().displayHelloWorld();
System.out.println(new HelloWorld().getUserName());
System.out.println("test end");

}catch(Exception e){
e.printStackTrace();
System.out.println(e);
}
}


public void paint(Graphics g) {
g.drawString("Hello:"+UserName,20,20);
}




public void setUserName(String UserName){
this.UserName = UserName;
}

public String getUserName(){
return UserName;
}


public void test(){

try{
System.out.println("test");
//new HelloWorld().displayHelloWorld();
UserName = new HelloWorld().getUserName();
System.out.println();
//new Hello().test();
System.out.println("test end******");

}catch(Exception e){
e.printStackTrace();
System.out.println(e);
}
}
}


6)編寫一個jsp文件調用applet。jniApplet.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>無標題文檔</title>

<script language="JavaScript">

function changeUserName(){
aaa = new String(document.form1.UserName.value);
document.myApplet.setUserName(aaa);
var s = document.myApplet.getUserName();
document.myApplet.test();
var ss = document.myApplet.getUserName();
alert(ss);
document.form1.UserName.value = ss;
document.myApplet.repaint();
return false;
}

</script>
</head>

<body>
<table>
<tr>
<td align="center" >
<applet ID='myApplet' Name='myApplet' code='Applet1.class' width='120' height='30' codebase=".\jar" archive="monitor.jar">
</applet>
</td>
<td align="center" valign="bottom" nowrap>
<form name=form1 >
Your Name:<input name=UserName size=10>
<input type=Button name=Btn value="Change Name" language="JavaScript" onclick="return changeUserName();">
</form>
</td>
</tr>
</table>
</body>
</html>


7)對剛才編譯出來的文件進行打包,這樣有利于applet的下載速度。
jar cvf monitor *.*
8)部署web程序
9)對客戶端修改安全權限文件。此文件在jdk的安裝目錄下。但測試發現在C:\Program Files\Java\j2re1.4.2_06\lib\security也有一個安全文件,也許是瀏覽調用的安全文件,就修改它。
/* AUTOMATICALLY GENERATED ON Thu Feb 24 09:23:05 CST 2005*/
/* DO NOT EDIT */

keystore "file:/C:/j2sdk1.4.2_06/jre/lib/security/cacerts", "JKS";

grant codeBase "file:${java.home}/lib/ext/*" {
permission java.security.AllPermission;
};
grant signedBy "monitor", codeBase "http://192.168.1.35:8080/" {
permission java.security.AllPermission, signedBy "monitor";
permission java.lang.RuntimePermission "usePolicy";
permission java.lang.RuntimePermission "createClassLoader", signedBy "monitor";
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "setContextClassLoader";
};

grant {
permission java.lang.RuntimePermission "stopThread";
permission java.net.SocketPermission "localhost:1024-", "listen";
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
permission java.util.PropertyPermission "java.vendor.url", "read";
permission java.util.PropertyPermission "java.class.version", "read";
permission java.util.PropertyPermission "os.name", "read";
permission java.util.PropertyPermission "os.version", "read";
permission java.util.PropertyPermission "os.arch", "read";
permission java.util.PropertyPermission "file.separator", "read";
permission java.util.PropertyPermission "path.separator", "read";
permission java.util.PropertyPermission "line.separator", "read";
permission java.util.PropertyPermission "java.specification.version", "read";
permission java.util.PropertyPermission "java.specification.vendor", "read";
permission java.util.PropertyPermission "java.specification.name", "read";
permission java.util.PropertyPermission "java.vm.specification.version", "read";
permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
permission java.util.PropertyPermission "java.vm.specification.name", "read";
permission java.util.PropertyPermission "java.vm.version", "read";
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "setContextClassLoader";

permission java.security.AllPermission;
permission java.lang.RuntimePermission "usePolicy";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "setContextClassLoader";
};

grant {
permission java.lang.RuntimePermission "loadLibrary.hello";
};

10)在客戶端配置dll。在環境變量path中設置dll所在的位置。
就這樣應該大功告成了,
posted on 2005-09-21 15:13
Harryson 閱讀(6207)
評論(13) 編輯 收藏 所屬分類:
Jni--Communication