java代码如下:
public class TestJni {

private static native void print(School s);

public static void main(){

School s = new School();
print(s);
}
}class School{

String[] studentNames = {"tom","jack","sophia"};

}在C代码中,如何把这个s.studentNames转化成为char**呢?
我写了一个ReadStringArray()的函数,但是是有问题的,在原有字符串后面会加几个乱码。char** ReadStringArray(JNIEnv * env, jclass jc, jobject jo, char* name, int size){
jfieldID id_array = env->GetFieldID(jc,name,"[Ljava/lang/String;");
jobjectArray joa_array = (jobjectArray)env->GetObjectField(jo,id_array); 
char** stringArray = new char*[size];

for(int i = 0; i < size; i++){ jobject obj_string = env->GetObjectArrayElement(joa_array,i);
jclass class_string = env->GetObjectClass(obj_string);
jfieldID id_value = env->GetFieldID(class_string,"value","[C");
jcharArray jca_value = (jcharArray)env->GetObjectField(obj_string,id_value);
int jca_size = env->GetArrayLength(jca_value);
jchar* temp = env->GetCharArrayElements(jca_value,0);
stringArray[i] = new char[jca_size];
for(int j = 0; j < jca_size; j++){
stringArray[i][j] = (char)temp[j];
}
}
return stringArray;
}请高手指教。

解决方案 »

  1.   

    刚才发现在C中加一行char** ReadStringArray(JNIEnv * env, jclass jc, jobject jo, char* name, int size){
        jfieldID id_array = env->GetFieldID(jc,name,"[Ljava/lang/String;");
        jobjectArray joa_array = (jobjectArray)env->GetObjectField(jo,id_array); 
        char** stringArray = new char*[size];
        
        for(int i = 0; i < size; i++){        jobject obj_string = env->GetObjectArrayElement(joa_array,i);
            jclass class_string = env->GetObjectClass(obj_string);
            jfieldID id_value = env->GetFieldID(class_string,"value","[C");
            jcharArray jca_value = (jcharArray)env->GetObjectField(obj_string,id_value);
            int jca_size = env->GetArrayLength(jca_value);
            jchar* temp = env->GetCharArrayElements(jca_value,0);
            stringArray[i] = new char[jca_size+1];
            for(int j = 0; j < jca_size; j++){
                stringArray[i][j] = (char)temp[j];
            }
            stringArray[i][jca_size]='\0';    }
        return stringArray;
    }即可,求高手给更野的解决方案。
      

  2.   

    经高人指点。得到下面的代码const char** ReadStringArray(JNIEnv * env, jclass jc, jobject jo, char* name){
    jfieldID id_array = env->GetFieldID(jc,name,"[Ljava/lang/String;");
    jobjectArray joa_array = (jobjectArray)env->GetObjectField(jo,id_array); 
    int size = env->GetArrayLength(joa_array);
    const char** stringArray = new const char*[size]; for(int i = 0; i < size; i++){
    jstring js_string = (jstring)env->GetObjectArrayElement(joa_array,i);
    stringArray[i] = env->GetStringUTFChars(js_string,0);
    }
    return stringArray;
    }