Android Java JNI и C Char array Не удается распознать значение

Я попытался передать массив символов из java в c. У меня есть путь для его реализации. Но когда я попытался получить доступ к значению массива, значение было неверным.

Фактически, я попытался передать массив персонажу. Just Like buffer[i]='z' , и результат корректен в android.

Btw, значение, которое я хотел, было значением, отправленным rs232. Значение из rs232 было в порядке.

Кто-то сказал мне использовать bytearray. Будет ли это работать? Я боялся, что стоимость от rs232 не может быть сохранена в байтере.

Java

 public native int OpenPort(int portnum,int brates); public native int ClosePort(int portnum); public native int READ(char[] databuffer); public char[] buffer=new char[40]; int i; for(i=0;i<40;i++) buffer[i]='s'; //initialization OpenPort(16,9600); // A function to open the rs232 port while (i<1000) { READ(buffer); i++; } 

JNI.c

 JNIEXPORT jint JNICALL Java_com_example_ndk_Vehicles_READ(JNIEnv *env, jclass cls,jcharArray databuffer) { char tmp[40]; jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0); memset(tmp,0,sizeof(tmp)); PollComport(16,tmp,40); //will the problem here ? This function need a unsigned char[] //,but in the c program I wrote , char[] was ok for this. memcpy(buffer,tmp,40); (*env)->ReleaseCharArrayElements(env, databuffer, buffer, 0); return 0; } 

Вот краткий пример

 public native int play(String filename_main, String filename_prev, int main_x, int main_y, int main_width, int main_height, int preview_x, int preview_y, int preview_width, int preview_height); 

Карты для

 int play(char* filename_main, char* filename_preview, int main_x, int main_y, int main_width, int main_height, int preview_x, int preview_y, int preview_width, int preview_height) 

Используя этот вызов JNI.

 JNIEXPORT jint JNICALL Java_com_rtrk_demo_PELib_play(JNIEnv *env, jobject obj, jstring main_video, jstring prev_video, jint main_x, jint main_y, jint main_width, jint main_height, jint prev_x, jint prev_y, jint prev_width, jint prev_height) { LOGI("JNICALL - Java_com_rtrk_demo_PELib_play(filename)\n"); const char* utf_main_video = env->GetStringUTFChars(main_video, 0); const char* utf_prev_video = env->GetStringUTFChars(prev_video, 0); char* file_main_video = (char*) malloc(strlen(utf_main_video) * sizeof(char) +1); char* file_prev_video = (char*) malloc(strlen(utf_prev_video) * sizeof(char) +1); strcpy(file_main_video, utf_main_video); strcpy(file_prev_video, utf_prev_video); LOGI("JNICALL - filenames: %s\t%s\n", file_main_video, file_prev_video); env->ReleaseStringUTFChars(main_video, utf_main_video); env->ReleaseStringUTFChars(prev_video, utf_prev_video); LOGI("###JNICALL RET - Java_com_rtrk_demo_PELib_play(%s, %s)\n", file_main_video, file_prev_video); int retVal = play(file_main_video, file_prev_video, (int)main_x, (int)main_y, (int)main_width, (int)main_height, (int)prev_x, (int)prev_y, (int)prev_width, (int)prev_height); free(file_main_video); free(file_prev_video); return retVal; } 

Поскольку GetCharArrayElements () разрешено создавать копию массива Java и вместо этого указывать указатель на копию. В вашем коде вы передаете значение null для аргумента pointer-to-boolean, который скажет вам, была ли сделана копия:

 jchar *buffer=(*env)->GetCharArrayElements(env,databuffer,0); 

Таким образом, вы, вероятно, работаете с копией, которая отбрасывается, когда вы закончите. Вместо GetCharArrayElements (), используйте свой локальный массив на C ++ и используйте SetCharArrayRegion (), чтобы скопировать их.