applet通过数字签名用JNI方式调用本地dll文件
写测试用的applet
第一步,首先弄明白applet怎么实现,里面要导入dll文件System.loadLibrary("fff")和声明用到的本地方法,这个文件会在下一步介绍如何生成
//Java代码
?
import java.applet.Applet;import java.awt.Graphics;public class MyApplet extends Applet {static {System.loadLibrary("fff");}public native int reint();@Overridepublic void paint(Graphics g) {int a=reint();g.drawString(String.valueOf(a), 5, 35);}}?
?
建立applet要用的dll文件
用VC6.0动态连接库工程起名为fff,这里要用到JNI技术了
先把MyApplet生成 .class文件javac MyApplet.java
然后要.class文件生成C引用的头文件javah?MyApplet.class
?
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class MyApplet */#ifndef _Included_MyApplet#define _Included_MyApplet#ifdef __cplusplusextern "C" {#endif#undef MyApplet_FOCUS_TRAVERSABLE_UNKNOWN#define MyApplet_FOCUS_TRAVERSABLE_UNKNOWN 0L#undef MyApplet_FOCUS_TRAVERSABLE_DEFAULT#define MyApplet_FOCUS_TRAVERSABLE_DEFAULT 1L#undef MyApplet_FOCUS_TRAVERSABLE_SET#define MyApplet_FOCUS_TRAVERSABLE_SET 2L#undef MyApplet_TOP_ALIGNMENT#define MyApplet_TOP_ALIGNMENT 0.0f#undef MyApplet_CENTER_ALIGNMENT#define MyApplet_CENTER_ALIGNMENT 0.5f#undef MyApplet_BOTTOM_ALIGNMENT#define MyApplet_BOTTOM_ALIGNMENT 1.0f#undef MyApplet_LEFT_ALIGNMENT#define MyApplet_LEFT_ALIGNMENT 0.0f#undef MyApplet_RIGHT_ALIGNMENT#define MyApplet_RIGHT_ALIGNMENT 1.0f#undef MyApplet_serialVersionUID#define MyApplet_serialVersionUID -7644114512714619750i64#undef MyApplet_serialVersionUID#define MyApplet_serialVersionUID 4613797578919906343i64#undef MyApplet_INCLUDE_SELF#define MyApplet_INCLUDE_SELF 1L#undef MyApplet_SEARCH_HEAVYWEIGHTS#define MyApplet_SEARCH_HEAVYWEIGHTS 1L#undef MyApplet_serialVersionUID#define MyApplet_serialVersionUID -2728009084054400034i64#undef MyApplet_serialVersionUID#define MyApplet_serialVersionUID -5836846270535785031i64/* * Class: MyApplet * Method: reint * Signature: ()I */JNIEXPORT jint JNICALL Java_MyApplet_reint (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif??
这里我们只关心那个方法,把方法copy到下面的c++source file里面
第三部具体的C++代码实现.
新建dll工程->新建c++ source file
//c++ code
#include"MyApplet.h"JNIEXPORT jint JNICALL Java_MyApplet_reint(JNIEnv *, jobject){return 3;}不用怀疑c++代码就这么简单,但是jni.h和Hello.h的路径要设置正确,编译器才能找到这两个文件
jni.h在jdk/include下
jni.h里面还会包含一个jni_md.h,在jdk/include/win32目录下
把以上提到的路径加到C++的库目录下.工具->选项->目录.
然后编译dll,就会生成我们需要的dll文件.
这个dll的文件名,就是我们在java代码中System.loadLiberary("fff")里面的这个参数,大小写无所谓,后缀名不需要,会自动识别。
System.loadLiberary()这个方法会默认搜索几个目录,把dll放在正确的目录下,这里比较重要,dll可以放在system32下,其他的自己研究,一定要放对不然会找不到的。
applet数字签名
为了安全,applet不可能具有肆无忌惮的权限,想读就读,想写就写,那样网络世界就乱套了。applet默认的安全机制是阻止对客户端的任何操作的(必须阻止).想要有更多权限必须通过对applet的jar包签名.
用java提供的工具进行如下操作(工具在jdk的bin目录下,我的是在C:\Program Files\Java\jdk1.6.0_24\bin)。以下红色代表改变成自己的具体文件名,经过以下三步即可
jar -cvf MyApplet.jar MyApplet.class
keytool -genkey -keystore MyApplet.keystore -alias Mission
jarsigner -keystore MyApplet.keystore MyApplet.jar Mission
首先:用jdk/bin目录下的jar把类生成jar包jar -cvf?MyApplet.jar MyApplet.class
然后:用jdk/bin目录下的keytool生成密钥库文件keytool -genkey -keystore?MyApplet.keystore?-alias?Mission 这里的Mission是随便写的,在下一步给jar文件签名要用到。这样会提示你输入一些信息,这些信息可以随便写,最后确认即可.
最后:用jdk/bin下的jarsigner和上一步生成的密钥库文件给jar文件签名?jarsigner -keystore?MyApplet.keystore MyApplet.jar Mission会提示你输入密码。这样就完成了签名。
不必要的发布证书与客户端导入证书
keytool ? -export ? -keystore ? MyApplet.keystore ? -alias Mission -file MyApplet.cer?
?
keytool -import -alias Mission -file MyApplet.cer -keystore password
最后要用的HTML文件
?
//HTML代码
?
<html>
<body>
<applet archive="MyApplet.jar" code="MyApplet.class" width="500" height="500"/>
</body>
</html>
?