我想设计一个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);
但是我觉得这样做是不对的。

解决方案 »

  1.   

    是否该这样呢? 不调用ReleaseByteArrayElements
    然后调用env->SetByteArrayRegion(buf, 0, ret, data);
      

  2.   


    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;现在的代码我改成这样的了,但是没有测试请问是否该这样呢?
      

  3.   

    这个buf空间非要从java层传输过来吗?java层知道需要接收的长度?
    不清楚你的具体情况,个人觉得可以直接在c++端创建buf接收,然后返回这个buf到java层。