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.

  • Rendimiento de Android NDK sobre el código Java habitual
  • Función nativa no se ha encontrado ninguna implementación
  • Android: error al cargar la biblioteca
  • Java JNI vs. Android NDK
  • Cómo depurar una aplicación en Android con GDBSERVER?
  • Enviar int s entre Java y C
  • Generación de archivos .so en Android Studio 1.0.2 con NDK
  • Cómo depurar código nativo en un proyecto de biblioteca de Android?
  • Devolver un int de la función nativa (c ++, jni) bloquea la aplicación
  • Llame a métodos de clase C ++ o funcione desde Java en android sin recrear clase / variable en cada llamada
  • Cómo agregar un servicio de sistema a Android Framework
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.