2011-08-21 4 views
7

Próbowałem przekazać tablicę znaków z java do c. Mam googleed sposób, aby go wdrożyć. Ale kiedy próbowałem uzyskać dostęp do wartości tablicy, wartość była niepoprawna.Android JNI i C Char tablicy Nie można rozpoznać wartości

W rzeczywistości próbowałem nadać tablicy charakter. Podobnie jak buffer[i]='z', a wynik jest poprawny w systemie Android.

Przy okazji, wartość, którą chciałem, była wartością wysłaną przez rs232. Wartość z rs232 była w porządku.

Ktoś powiedział mi, żebym użył bytearray. Czy to działa? Bałam się, że wartość z RS232 nie może być sklep w 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

Co z twoim pytaniem? – jogabonito

+0

jeśli chcesz ** przekazać tablicę znaków z java do c **, poleciłabym je przekazać jako char * –

+0

jeśli chcesz użyć tablicy bajtów, użyj tego ** jbyteArray jb; jb = (* env) -> NewByteArray (env, finfo.st_size); (* env) -> SetByteArrayRegion (env, jb, 0, \t \t finfo.st_size, (jbyte *) m); zamknij (fd); ** Tablica może zostać jawnie zwolniona przez ** (* env) -> ReleaseByteArrayElements (env, jb, (jbajt *) m, 0); ** –

Odpowiedz

0

Oto krótki przykład

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

mapy do

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) 

przy użyciu tego połączenia 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

Ponieważ GetCharArrayElements() może wykonać kopię tablicy Java i wręczyć Ci wskaźnik do kopii zamiast. W kodzie, jesteś przejazdem w null dla argumentu pointer-to-logiczna, która powie ci, jeśli kopia została wykonana:

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

Więc jesteś prawdopodobnie działających na egzemplarzu, który odrzuca się, gdy skończysz. Zamiast GetCharArrayElements() operuj na lokalnej tablicy w C++ i używaj SetCharArrayRegion() do ich kopiowania.