【发布时间】:2011-10-31 13:32:07
【问题描述】:
我试图将 char 数组从 java 传递给 c。我已经用谷歌搜索了实现它的方法。但是当我尝试访问数组的值时,值不正确。
事实上,我试图给数组一个字符。就像buffer[i]='z',结果在android中是正确的。
顺便说一句,我想要的值是 rs232 发送的值。 rs232 的值没问题。
有人告诉我使用字节数组。它会起作用吗?我担心来自 rs232 的值无法存储到 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;
}
【问题讨论】:
-
如果你想将 char 数组从 java 传递给 c,我建议你将它们作为 char* 传递
-
如果你想使用字节数组然后使用这个 jbyteArray jb; jb=(*env)->NewByteArray(env, finfo.st_size); (*env)->SetByteArrayRegion(env, jb, 0, finfo.st_size, (jbyte *)m); close(fd); 数组可以通过 (*env)-> ReleaseByteArrayElements(env, jb, (jbyte *)m, 0); 显式释放
-
对象数组和基元类型数组的区别在于构造jobjectarray类型时,使用Java语言类作为参数。
-
如何将 char[] 从 Java 发送到此 JNI 调用? String.getBytes() ?还是 String.getBytes("UTF-8") ?
-
您将 16 位的 Java
char与 8 位的 Cchar混淆了。您需要在此处始终使用 Javabyte,包括您的 Java 端代码。
标签: java android java-native-interface