Android Java JNI y C Char array No se puede reconocer el valor

Intenté pasar la matriz char de java a c. He googled la manera de implementarlo. Pero cuando traté de acceder al valor de la matriz, el valor no era correcto.

De hecho, traté de dar a la matriz un carácter. Al igual que buffer[i]='z' , y el resultado es correcto en android.

Btw, el valor que quería era el valor enviado por el rs232. El valor de la rs232 estaba bien.

Alguien me dijo que usara el bytearray. ¿Funcionaría? Tenía miedo de que el valor de rs232 no podría ser almacenar en el bytearray ….

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; } 

Aquí hay un ejemplo rápido

 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); 

Mapas a

 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) 

Utilizando esta llamada 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; } 

Debido a que GetCharArrayElements () se permite hacer una copia de la matriz de Java y entregarle un puntero a la copia en su lugar. En su código, está pasando en null para el argumento de puntero a booleano que le diría si se hizo una copia:

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

Así que es probable que el funcionamiento de una copia que se descarta cuando haya terminado. En lugar de GetCharArrayElements (), opere en su matriz local en C ++ y use SetCharArrayRegion () para copiarlos.

  • Técnica subyacente de FaceDetector de Android
  • Error durante la compilación de la muestra de jni de android: inválido -march = opción: `armv5te '
  • Rellenar los datos en un mapa de bits de Android tan pronto como sea posible desde C
  • ¿Cómo se aplica el permiso de Android?
  • Filtrado de MatOfDMatch
  • Javah Error android.app.Activity not found
  • Android ffmpeg simple JNI envoltorio
  • ¿Cómo crear un socket Android RFCOMM sin ninguna entrada del usuario?
  • Rotación de un mapa de bits mediante JNI y NDK
  • Android NDK / JNI: Creación de una biblioteca compartida que depende de otras bibliotecas compartidas
  • Uso de funciones nativas en Android con OpenCV
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.