写测试用的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();
@Override
public 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 __cplusplus extern "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
不用怀疑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代码
<body>
<applet archive="MyApplet.jar" code="MyApplet.class" width="500" height="500"/>
</body>
</html>