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);
}上面都是从书上抄来的,如果有帮助那就是最好了!

解决方案 »

  1.   

    http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/index.html
      

  2.   

    为什么不看看the java tutorial呢?
    http://java.sun.com/docs/books/tutorial/
    里面有关于jni的整整一章,有助理解!
      

  3.   

    既然是JNI,理应可调用任何的 C 库函数,----那我不用这两个参数变量可以吗?
    我现在的课题是在JAVA(SERVLET)中准备调用一个已存在的DLL(C编写)
    ----但不知该如何是好…………有什么简单办法吗?
    多谢各位大侠。
      

  4.   

    我的想法是把已有的dll解开加入与java的接口函数,然后再重新编译成dll供java调用。
      

  5.   

    也可以做个wrapper, 做一个和java交互的dll, 并且,该dll负责同已有dll通信 :)
      

  6.   

    要想用一个已经存在的DLL而不用去修改源代码、重新编译的话就只能用楼上的方法了。
    你还是照样写你的native method,照样生成你的.C .H文件,只不过实现的时候全部去引用现存的DLL中的接口函数就是了。
      

  7.   

    To Dureak,luodi:
      什么是wrapper???哪里有相关的资料?
      实际实现时如何做?
      还有,那两个参数如何用:JNIEnv * 和 jobject ???
      JNIEnv * 可创建对象,调用方法等等---如何理解???
      十分感谢回复!
      

  8.   

    参考 http://www.csdn.net/expert/topic/93/93645.shtm