我想设计一个recv函数
JNIEXPORT jint JNICALL Java_com_cn_connect_SocketUnit_recv(
JNIEnv * env, jclass cls, jint sock, jbyteArray buf, jint len)
我想的是JAVA成传一个byte[]数组 和长度过来。 我把接收的数据写到这个buf里面。
我现在只知道可以
char* data = (char*)((*env)->GetByteArrayElements(env, buf, 0));
从jbyteArray转成char*取得数据。
然后使用ReleaseByteArrayElements释放。我现在的代码大概是这样的。 if (sock == -1) {
return -1;
}
char* data = (char*)((*env)->GetByteArrayElements(env, buf, 0));
if (data == 0) {
return -1;
}
int ret = recv(sock, data, len, 0);
if (ret == 0) {
break; //socket probably closed
} else if (ret < 0) {
break; //handle errors appropriately
}
(*env)->ReleaseByteArrayElements(env, buf, data, 0);
但是我觉得这样做是不对的。
JNIEXPORT jint JNICALL Java_com_cn_connect_SocketUnit_recv(
JNIEnv * env, jclass cls, jint sock, jbyteArray buf, jint len)
我想的是JAVA成传一个byte[]数组 和长度过来。 我把接收的数据写到这个buf里面。
我现在只知道可以
char* data = (char*)((*env)->GetByteArrayElements(env, buf, 0));
从jbyteArray转成char*取得数据。
然后使用ReleaseByteArrayElements释放。我现在的代码大概是这样的。 if (sock == -1) {
return -1;
}
char* data = (char*)((*env)->GetByteArrayElements(env, buf, 0));
if (data == 0) {
return -1;
}
int ret = recv(sock, data, len, 0);
if (ret == 0) {
break; //socket probably closed
} else if (ret < 0) {
break; //handle errors appropriately
}
(*env)->ReleaseByteArrayElements(env, buf, data, 0);
但是我觉得这样做是不对的。
然后调用env->SetByteArrayRegion(buf, 0, ret, data);
if (sock == -1) {
return -1;
}
char* data = (char*)((*env)->GetByteArrayElements(env, buf, 0));
if (data == 0) {
return -1;
}
int ret = recv(sock, data, len, 0);
if (ret == 0) {
break; //socket probably closed
} else if (ret < 0) {
break; //handle errors appropriately
}
(*env)->SetByteArrayRegion(env, buf, 0, ret, data);
(*env)->ReleaseByteArrayElements(env, buf, data, 0);
return ret;现在的代码我改成这样的了,但是没有测试请问是否该这样呢?
不清楚你的具体情况,个人觉得可以直接在c++端创建buf接收,然后返回这个buf到java层。