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;
}
Co z twoim pytaniem? – jogabonito
jeśli chcesz ** przekazać tablicę znaków z java do c **, poleciłabym je przekazać jako char * –
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); ** –