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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
JNI 返回 jbyteArray
JNI 返回 jbyteArray
android jni 将BYTE* 和 jbyteArray 之间的转换
 今天,简单讲讲如何在jni中将  BYTE* 转成 jbyteArray。 这个是我在做jni时碰到的问题。因为c传回的值是BYTE*,而返回给java代码是byte[],对应的jni的数据必须是jbyteArray,所以需要转换。在网上搜索了资料,终于是解决了这个问题。 C++中的BYTE[]转jbyteArray //nOutSize是BYTE数组的长度
JNI byteArray 传递与返回
JNIEXPORTjbyteArray JNICALL Java_com_example_hellojni_AES_AES_1Encrypt   (JNIEnv *env, jobject jo, jbyteArray key){     //  jbyte* pJbyte = (*env)->GetByteArrayElements(env,key,0); //  jbyte keyA
Jni中本地类型和java类型对应表
表A Java 类型 本地类型 描述 boolean jboolean C/C++8位整型 byte jbyte C/C++带符号的8位整型 char jchar C/C++无符号的16位整型 short jshort C/C++带符号的16位整型 int jint C/C++带符号的32位整型
java jni jbyteArray传参给c++
unsigned char* myobfuscate(unsigned char *s) { unsigned char key, mod, len; int i; unsigned char* d; key = s[0]; mod = 0x66; len = strlen((const char*)s); d = (unsigned ch
Android JNI JByteArray传递byte数组到Java
1:C语言char转JNI 中jByteArray 给Java使用 int setjArraybyte(JNIEnv *env,jclass cls,jmethodID mid,char* pat) {         LOGE("callback to setjArraybyte"); jByteArray  jbarray = (*env)->NewByteArray(env,2)
jni 与java 之间传递bytearray
要实现在java 端传递bytearray 到jni 端,同时在jni 端要反馈回bytearray 在java 端的声明如下:   public native byte[] Bluetooth_NativeProcessData_Send(byte[] data,int len);   public native byte[] Bluetooth_NativeProcessData
jni返回byte[]
jni返回byte[]
JNI 对象处理和数据类型转换
作者:陈波 2011/10/30(转载请注明出处,From:http://blog.csdn.net/jinhill/article/details/6918821) 最近做Android开发的人越来越多,Android开发难免会遇到调用本地库,这就需要采用JNI技术,JNI本身并不复杂,但大多数开发者在类型转换上遇到麻烦,今天特地将几种常用类型转换写成一个实例来告诉大家如何转换,尤其是Java
JNI各类型参数互相调用
1、java 传入的String  在 C 中转化为 char*打印出来 jstring obj; const char* string = (char*)(*env)->GetStringUTFChars(env,obj,NULL); __android_log_print(ANDROID_LOG_INFO, "JNIMsg",string); 2、'for' loop initial