2011-08-21 5 views
7

Ho provato a passare il char array da java a c. Ho cercato su Google come implementarlo. Ma quando ho provato ad accedere al valore dell'array, il valore non era corretto.Java Java JNI e C Char array Impossibile riconoscere il valore

Infatti, ho provato a dare un carattere all'array. Proprio come buffer[i]='z', e il risultato è corretto in Android.

Btw, il valore che volevo era il valore inviato da rs232. Il valore di rs232 era ok.

Qualcuno mi ha detto di usare il bytearray. Funzionerebbe? Avevo paura di che il valore da RS232 non poteva essere negozio nel 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

Qual è la tua domanda? – jogabonito

+0

se si desidera ** passare l'array di caratteri da java a c **, si consiglia di passarli come char * –

+0

se si desidera utilizzare array di byte quindi utilizzare questo ** jbyteArray jb; jb = (* env) -> NewByteArray (env, finfo.st_size); (* env) -> SetByteArrayRegion (env, jb, 0, \t \t finfo.st_size, (jbyte *) m); close (fd); ** La matrice può essere esplicitamente liberata da ** (* env) -> ReleaseByteArrayElements (env, jb, (jbyte *) m, 0); ** –

risposta

0

Ecco un esempio veloce

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

mappe per

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) 

utilizzando questa chiamata JNI.

0

Poiché GetCharArrayElements() è autorizzato a creare una copia dell'array Java e invece a consegnare un puntatore alla copia. Nel codice, si sta passando a nullo per l'argomento puntatore a booleano che dirà se una copia è stata fatta:

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

Quindi è probabile che operando su una copia che viene scartata quando si è fatto. Invece di GetCharArrayElements(), operare sull'array locale in C++ e utilizzare SetCharArrayRegion() per copiarli.