最近使用jni在vc中调用java类中的方法,java中的方法的一个参数是string[] 数组,在VC中把指针传进了JAVA中,在JAVA中修改了数组中的每个成员,希望在VC中得到JAVA修改后的结果,但是每次执行都是出错,但是如果在JAVA中不对数组这个参数进行修改操作就不出错。仔细一想,原来是JAVA的引用问题,JAVA并没有如VC期望的那样,把传进来的指针的内容改变,而是又生成一个新的字符串,把指针指向了新的字符串,结果VC立刻察觉有人动了他的指针指向,报错了,VC是希望JAVA直接修改传给它的指针的内容。
不知道各位有什么办法,去直接修改一个数组成员的值,而不是修改它的引用?

解决方案 »

  1.   

    //设置参数,java---〉C jsize len = env->GetArrayLength(jSetArray);
    jfloat *body = env->GetFloatArrayElements(jSetArray, 0); float* fArray = new float[len];
    for(int i = 0; i < len; i++)
    {
    fArray[i] = body[i];
    }//这里就可以用fArray了 env->ReleaseFloatArrayElements(jSetArray, body, 0); delete fArray;

    return NULL;
    } //获取参数C---->Java {
    jsize len = env->GetArrayLength(jSetArray);
    jfloatArray deviceArray = env->NewFloatArray(len);
    jfloat* body = env->GetFloatArrayElements(deviceArray, 0);//这里就可以用了

    env->ReleaseFloatArrayElements(deviceArray, body, 0); return deviceArray;
      

  2.   

    请问楼上的,你这是float数组,我还没试过,我试的是string数组,而且还没执行到我取它的值的时候就出错了,我在 env->GetMethodID这一步就已经错了
      

  3.   

    我快放弃了,关键问题就是vc传进来指针希望java修改指针,string 在java中是final类型,而不能修改,所以我最后认为,利用jni,用参数来得到返回值不能实现,只能靠return得到值,因为retrun 的东西都是在java内处理的,参数要让vc和java共同来处理,就错了。