2 kozeng kozeng 于 2015.06.09 15:28 提问

JNI 返回 jbytearray类型

JNIEXPORT jint JNICALL Java_com_serial_android_serialnative_jni_serial_read(JNIEnv *env, jobject obj , jint fd, jbyteArray buffer, jint size, jint rcv_wait){

// LOGD("serial_read");
// char buf[256];
// char savedata[256];
int len = 0;
int i = 0;
int j;
int ret = 0;
// jbyteArray array = env->NewByteArray(size);
// jbyte *bytes = env->GetByteArrayElements(array, 0);
// memset(savedata, 0, 256);
// tcflush(serialFd, TCIOFLUSH);

jbyte* buf = (jbyte *)malloc(size);

jbyte* savedata = (jbyte *)malloc(size);
memset(buf, 0, 256);
memset(savedata, 0, 256);
if (!buf) {
LOGD("malloc buf error");
return -1;
}
while (1)
{
len = read(serialFd, buf, size);
if(len < 0)
{
LOGD("read error");
break;
}else if (len == 0)
{
LOGD("read end or no data");
break;
}else if (len > 0){
for (j = 0;j < len ;j++ )
{
savedata[i] = buf[j];
i++;
}

}
LOGD("read number = %d", len);
}

if (savedata[0] == 0x2e)
{
ret = check_packege(savedata); //校验
LOGD("check_sum = %d", ret);
}
if (ret == 1)
{
env->SetByteArrayRegion(buffer, 0, size, savedata);
for (j = 0;j < 6 ; j++)
{
LOGD("read = %02x", buffer[j]);
}
}

free(buf);
free(savedata);
return 1;

savedata的数据都是正确的, 但是执行下面函数SetByteArrayRegion后, buffer就是全0了。 Android framework里面frameworks\base\core\jni\android_hardware_SerialPort.cpp的标准串口操作就是这样的, 我都是cpy了代码了,但还是不行,不指点为什么。
env->SetByteArrayRegion(buffer, 0, size, savedata);

Csdn user default icon
上传中...
上传图片
插入图片