3. 将c中获取的一个char*的buffer传递给java?
2013-03-06 18:49
197 查看
3. 将c中获取的一个char*的buffer传递给java?
这个char*如果是一般的字符串的话,作为string传回去就可以了。如果是含有’\0’的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到’\0’就截断了。
有两种方式传递得到的数据:
一种是在jni中直接new一个byte数组,然后调用函数(*env)->SetByteArrayRegion(env,bytearray, 0, len, buffer);将buffer的值copy到bytearray中,函数直接returnbytearray就可以了。
一种是return错误号,数据作为参数传出,但是java的基本数据类型是传值,对象是传递的引用,所以将这个需要传出的byte数组用某个类包一下,如下:
class RetObj { public byte[] bytearray; } 这个对象作为函数的参数retobj传出,通过如下函数将retobj中的byte数组赋值便于传出。代码如下:
jclass cls;
jfieldID fid;
jbyteArray bytearray;
bytearray = (*env)->NewByteArray(env,len);
(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);
cls = (*env)->GetObjectClass(env, retobj);
fid = (*env)->GetFieldID(env, cls, "retbytes","[B"]);
(*env)->SetObjectField(env, retobj, fid, bytearray);
4. 不知道占用多少空间的buffer,如何传递出去呢?
在jni的c文件中new出空间,传递出去。java的数据不初始化,指向传递出去的空间即可。
对J***A传入数据的处理
1. 如果传入的是bytearray的话,作如下处理得到buffer:
char *tmpdata = (char*)(*env)->GetByteArrayElements(env,bytearray, NULL);
(*env)->ReleaseByteArrayElements(env,bytearray, tmpdata, 0);
这个char*如果是一般的字符串的话,作为string传回去就可以了。如果是含有’\0’的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到’\0’就截断了。
有两种方式传递得到的数据:
一种是在jni中直接new一个byte数组,然后调用函数(*env)->SetByteArrayRegion(env,bytearray, 0, len, buffer);将buffer的值copy到bytearray中,函数直接returnbytearray就可以了。
一种是return错误号,数据作为参数传出,但是java的基本数据类型是传值,对象是传递的引用,所以将这个需要传出的byte数组用某个类包一下,如下:
class RetObj { public byte[] bytearray; } 这个对象作为函数的参数retobj传出,通过如下函数将retobj中的byte数组赋值便于传出。代码如下:
jclass cls;
jfieldID fid;
jbyteArray bytearray;
bytearray = (*env)->NewByteArray(env,len);
(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);
cls = (*env)->GetObjectClass(env, retobj);
fid = (*env)->GetFieldID(env, cls, "retbytes","[B"]);
(*env)->SetObjectField(env, retobj, fid, bytearray);
4. 不知道占用多少空间的buffer,如何传递出去呢?
在jni的c文件中new出空间,传递出去。java的数据不初始化,指向传递出去的空间即可。
对J***A传入数据的处理
1. 如果传入的是bytearray的话,作如下处理得到buffer:
char *tmpdata = (char*)(*env)->GetByteArrayElements(env,bytearray, NULL);
(*env)->ReleaseByteArrayElements(env,bytearray, tmpdata, 0);
相关文章推荐
- 简单的Java网络爬虫(获取一个网页中的邮箱)
- 在DWR中实现直接获取一个JAVA类的返回值的两种方法
- 分享java程序设计中一个小程序:获取当前系统日期和时间在小程序中显示出来
- java获取一个字符串在屏幕上的尺寸的方法
- java里char为什么能够存储一个汉字
- 项目中一个普通的Java类如何获取service接口(一)
- asp.net frameset里一个frame中获取下拉框、单选框的值并作为参数传递到另一个frame里并显示结果
- java程序题:公用电话传递数据加密的一个问题
- Java 通过反射获取一个Field对象的泛型类型
- [置顶] 一个菜鸟java码农的成长之路(5):如何获取10个1-20的随机数,要求不能重复
- java获取某个字符在一个字符串中出现的下标(从0开始)
- java中获取一个集合(Set)的子集的方法
- jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
- 【Java】获取一个目录下的名称符合一定要求的全部文件+目录
- Java实现app接口和Socket消息传递(11)获取在线用户列表
- 用Java获取一个网站的基本配置信息
- 实现一个sizeof获取Java对象大小
- java 输入一个整数n,根据n获取Fibonacci数列的第n个值
- 在DWR中实现直接获取一个JAVA类的返回值