2011-08-21 5 views
7

Intenté pasar la matriz de caracteres de java a c. He buscado en Google el camino para implementarlo. Pero cuando intenté acceder al valor de la matriz, el valor no era correcto.Android Java JNI y C Char array No se puede reconocer el valor

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

Por cierto, el valor que quería era el valor enviado por el rs232. El valor del rs232 estaba bien.

Alguien me dijo que usara el bytearray. ¿Funcionaría? Tenía miedo de que el valor del RS232 no podría ser tienda 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; 
} 
+0

¿Cuál es su pregunta? – jogabonito

+0

si quieres ** pasar la matriz char de java a c ** te recomendaría que simplemente las pases como char * –

+0

si quieres usar una matriz de bytes y luego usa esta ** jbyteArray jb; jb = (* env) -> NewByteArray (env, finfo.st_size); (* env) -> SetByteArrayRegion (env, jb, 0, \t \t finfo.st_size, (jbyte *) m); close (fd); ** La matriz se puede liberar explícitamente mediante ** (* env) -> ReleaseByteArrayElements (env, jb, (jbyte *) m, 0); ** –

Respuesta

0

Aquí está 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) 

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

Debido GetCharArrayElements() se le permite hacer una copia de la matriz de Java y te dará un puntero a la copia en su lugar. En su código, está de paso en nulo para el argumento de puntero a booleano que indicará si se hizo una copia:

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

lo que es probable que funcionan en un ejemplar que se desecha cuando haya terminado. En lugar de GetCharArrayElements(), opere en su matriz local en C++ y use SetCharArrayRegion() para copiarlos.

Cuestiones relacionadas