char* argv[] 指針數組傳入jni

比如說c中有 int safe(int argc,char* argv[]){}char* argv[] 這個指針數組 怎麼傳到jni中?如果 寫成這樣

public class Safe {
 public native static int safe(int argc, String[] argv);
 static { 
System.loadLibrary("safe"); 
}
}

而本地方法中

JNIEXPORT jint JNICALL Java_Safe_safe(JNIEnv *env, jclass cl, jint argc, jobjectArray argv)
{ int j; jobject x = (*env)->GetObjectArrayElement(env,argv,j);}

又怎麼把這個x 轉成原來一樣的指針數組char* argv[]?

在java中,String[]類型是對象,所以在jni中對應的是jobjectArray

用GetObjectArrayElement()獲得該對象

給出例子:

//對數組中的每一個字符串進行轉化

JNIEXPORT void JNICALL Java_test_D_printsome
  (JNIEnv * env, jobject jobj, jobjectArray array){
   jsize len = (*env)->GetArrayLength(env, array);
   char str[10][128];
   int i;
   for(i = 0; i < len; i++){
    //獲得jobject對象,並將jobject對象向jstring對象轉化
    jstring string = (jstring)((*env)->GetObjectArrayElement(env, array, i));//獲得array對象
    const char * row = (*env)->GetStringUTFChars(env, string, 0);//將jstring類型轉化爲char類型
    strcpy(str[i], row);
   }
  for(i = 0; i < len; i++){
   printf("%s", str[i]);
  }
}
(*env)->ReleaseStringUTFChars(env,jrow,row);//釋放jni



jstring string = ((*env)->GetObjectArrayElement(env, array, i))
這句還可以改成:

jobject  x = (*env)->GetObjectArrayElement(env, arrar, i);

jstring string = (jstring)x;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章