JNI方法可以很容易地访问甚至改变被激活对象的成员域,这是通过使用各种JNI访问方法来实现的,而这些方法则是有变成者通过作为第一个参数的传给每个JNI方法的接口指针。JNI接口指针的类型是JNIENV,第二个参数随本地方法彻底性者不同而不同,对于一个非静态本地方法而言,该参数是一个对象的引用,而对有静态方法而言则是他的JAVA类的引用。通过访问函数来访问JAVA对象成员,保证了本地方法实现了可移植性。
Sample:public class SayHello {
public String text = "java joe";
public int age = 0;
public native void greet();
static {
System.loadLabrary("SayHello.dll");
} public void howOld() {
System.out.println(test + "is + age + "years old today");
} public static void main(String[] args) {
SayHello s = new SayHello();
s.greet();
s.howOld();
}
}#include "SayHello.h"JNIEXPORT void JNICALL Java_SayHello_greet(JNIEnv * env,jobject this)
{
jfieldID jf;
jclass jc;
jobject jobj;
jint new_age = 2;
jc = (*env)->GetObjectClass(env,this);
jf = (*env)->GetFieldID(env,jc,"text","Ljava/lang/Sring");
jobj = (*env)->GetObjectField(env,this,jf);
pal = (*env)->GetStringUTFChars(env,jobj,0);
printf("Hi%s!Welcome to the netherworld of native methods!\n",pal);
jf = (*env)->GetFieldID(env,jc,"age","1");
(*env)->SetIntField(env,this,jf,new_age);
}上面都是从书上抄来的,如果有帮助那就是最好了!
Sample:public class SayHello {
public String text = "java joe";
public int age = 0;
public native void greet();
static {
System.loadLabrary("SayHello.dll");
} public void howOld() {
System.out.println(test + "is + age + "years old today");
} public static void main(String[] args) {
SayHello s = new SayHello();
s.greet();
s.howOld();
}
}#include "SayHello.h"JNIEXPORT void JNICALL Java_SayHello_greet(JNIEnv * env,jobject this)
{
jfieldID jf;
jclass jc;
jobject jobj;
jint new_age = 2;
jc = (*env)->GetObjectClass(env,this);
jf = (*env)->GetFieldID(env,jc,"text","Ljava/lang/Sring");
jobj = (*env)->GetObjectField(env,this,jf);
pal = (*env)->GetStringUTFChars(env,jobj,0);
printf("Hi%s!Welcome to the netherworld of native methods!\n",pal);
jf = (*env)->GetFieldID(env,jc,"age","1");
(*env)->SetIntField(env,this,jf,new_age);
}上面都是从书上抄来的,如果有帮助那就是最好了!
http://java.sun.com/docs/books/tutorial/
里面有关于jni的整整一章,有助理解!
我现在的课题是在JAVA(SERVLET)中准备调用一个已存在的DLL(C编写)
----但不知该如何是好…………有什么简单办法吗?
多谢各位大侠。
你还是照样写你的native method,照样生成你的.C .H文件,只不过实现的时候全部去引用现存的DLL中的接口函数就是了。
什么是wrapper???哪里有相关的资料?
实际实现时如何做?
还有,那两个参数如何用:JNIEnv * 和 jobject ???
JNIEnv * 可创建对象,调用方法等等---如何理解???
十分感谢回复!