在java中定义一个静态变量,在本地方法中使用(比如在c中)并改变他的值,执行完本地方法后,能取到改变后的值吗?

解决方案 »

  1.   

    可以,但是java是传值的,你的要求需要传递地址进去,这就需要绕一下了。
      

  2.   

    jni未用过,暂时没用上,下回碰到再顶
      

  3.   

    你自己想像一下,只要是在同一个虚拟机中,由同一个ClassLoader加载的,那么那个静态变量改变之后,在其他地方是有效果的
      

  4.   

    当然可以,以下是测试:你可试一下:
    //Test.java
    public class Test
    {
     static int x;  public  static native void test();
      static
      {
        System.loadLibrary( "test" );
      }
      public static void main( String[] args )
       {
          x=100;
          System.out.println(x);
          test();
          System.out.println(x);
         
       }
    }
    //test.cpp
    #include "Test.h"
    JNIEXPORT void JNICALL Java_Test_test
      (JNIEnv *env, jclass cls)
    {
      jfieldID field = env->GetStaticFieldID(cls,"x","I");      //得到x的id
      jint x=(jint)env-> GetStaticIntField(cls, field);  //得到x的值
      printf("(in C++)x=%d\n",x);
      x=200;
      env->SetStaticIntField(cls,field,x);       //改x的值
     
    }
    -------------结果-------
    100
    (in C++)x=100
    200
      

  5.   

    楼上的意思是不通过传递参数的方式(确实这种方式是传值的),而是用env->GetStaticFieldID(cls,"x","I");这种方式.那么 "I"是什么意思啊?多谢.