1. Java applet
>javac -d . HelloApplet.java
>appletviewer HelloApplet.html
或者直接用IE打开
// HelloApplet.java
public class HelloApplet extends java.applet.Applet
{
public void paint(java.awt.Graphics g)
{
g.drawString( " Hello Applet! " , 50 , 25 );
}
public static void main(String[] args)
{
System.out.println( " Hello " + " " + " World " + " ! " );
}
}
<!-- HelloApplet.html -->
< html >
< head >
< title > Hello Applet </ title >
</ head >
< body >
Here is the "Hello Applet":
< applet code ="HelloApplet.class" width ="150" height ="25" ></ applet >
</ body >
</ html >
2. native method
1) Java文件, HelloJni.java, 并编译
>javac -d . HelloJni.java
package tony.test;
public class HelloJni
{
private static final String jniLib = " HelloJni " ;
public native int add( int i1, int i2);
static
{
System.loadLibrary(jniLib);
}
public static void main(String[] args)
{
int i1 = 100 ;
int i2 = 200 ;
System.out.println( new HelloJni().add(i1, i2));
}
}
2) 生成C++ (Native) 文件tony_test_HelloJni.h
>javah -jni tony.test.HelloJni
3) 编写HelloJni.cpp
#include " tony_test_HelloJni.h "
JNIEXPORT jint JNICALL Java_tony_test_HelloJni_add(JNIEnv * env, jobject obj, jint i1, jint i2)
{
int i = i1 + i2;
return i;
}
4) 编译生成dll
Windows:
>cl -I%JAVA_HOME%/include -I%JAVA_HOME%/include/win32 -LD HelloJni.cpp -FeHelloJni.dll
Solaris:
#cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris HelloJni.cpp / -o libHelloJni.so
-G选项指生成动态链接库.
这里需要说明的是, 在windows下和solaris动态链接库的名称分别为HelloJni.dll和libHelloJni.so.
在java.lang.System下有三个与加载动态链接库有关的函数: load, mapLibraryName, loadLibrary.
load参数为动态链接库绝对路径, 如System.load("F://codes//jnicode//HelloJni.dll");
mapLibraryName会根据操作系统和参数动态链接库名来返回对应的动态链接库文件名, 比如, System.mapLibraryName("HelloJni"); 在Windows下返回HelloJni.dll, 在Solaris下返回libHelloJni.so;
loadLibrary参数为动态链接库名, 如System.load("HelloJni"); 对于不同的系统它会加载对应的库(windows下加载HelloJni.dll, Solaris下加载libHelloJni.so), 而不需改Java代码.
5) 运行Java程序
>java tony.test.HelloJni
两个不错的参考:
Jni中C++和Java的参数传递
[JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
推荐一个开源项目: Jace. 极大地方便JNI编程.
http://sourceforge.net/projects/jace/
jace.1.1rc1_05
"Jace is a toolkit designed to make it easy to write JNI-based programs. Jace consists of a C++ runtime library, and a set of tools written in Java. Because Jace is not a framework, it leaves all possible options open to the developer.
Jace's C++ runtime library provides an easy to use API that allows user to manipulate Java objects as if they were C++ objects. Behind the scenes, the runtime library automatically manages the lifetimes of Java references, the mapping of Java exceptions to C++ exceptions, and the binding of C++ threads to the JVM.
Jace's Java tools can automatically generate C++ Proxy classes and C++ Peer classes from Java classes. This means that you can easily access any Java object or implement any Java native function from your C++ code. "