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

2 Solutions collect form web for “Android Java JNI y C Char array No se puede reconocer el valor”

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.

  • no se puede encontrar el símbolo "__android_log_write" - Registro nativo de Android
  • Cómo especificar el archivo de encabezado c en el archivo android.mk
  • Cómo utilizar OpenSSL Library en la aplicación ANDROID
  • Llame a un método java estático de otro paquete de código nativo
  • JNI manteniendo una referencia global a un objeto, accediendo a ella con otros métodos JNI. Mantener un objeto C ++ activo en varias llamadas JNI
  • Obtener un puntero JNIEnv válido
  • Uso de pjsip con android
  • ¿Cómo obtengo el búfer de la cámara Android en bruto en C con JNI?
  • Enviar un parámetro android.content.Context a una función con JNI
  • Android - javah no encuentra mi clase
  • Macro de preprocesador en Android.mk se ignora, pero funciona en Application.mk
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.