【发布时间】:2014-02-02 06:24:16
【问题描述】:
我正在开发一个充当 TCP 服务器/客户端的 Android 应用程序,我想将数据从应用程序发送到用 c/c++(使用 boost 库制作)编写的服务器/客户端。我有一个普通的 Java 函数,它调用本机 c 函数将字符串转换为字节:
函数定义如下(原生函数是Convert String:
// Send buffer, the method can be used by both client and server objects.
public void SendBuffer(String Buffer){
try {
// Convert char to string to byte
byte[] Temp = new byte[10];
String Teststring = "AAAAAAAABB";
Temp = ConvertString(Teststring);
//byte[] Temp = new String(Buffer).getBytes();
// Get socket output stream
OutputStream OutputBuffer = ClientSocket.getOutputStream();
//Write byte data to outputstream
OutputBuffer.write(Temp);
// Neatly flush and close the outputbuffer
OutputBuffer.flush();
OutputBuffer.close();
}
catch (IOException e) {
Log.e("TCPIPCommunicator: ", "Client: Failed to send", e);
e.printStackTrace();
}
}
函数ConvertString是一个将Java字符串转换为C/C++字符串并以Java字节返回的native函数,定义如下:
JNIEXPORT jbyteArray JNICALL Java_com_example_communicationmoduleTCPIP_communicationmoduleTCPIP_ConvertString(
JNIEnv * env, jobject,
jstring Buffer)
{
// Array to fill with data
jbyteArray Array;
// Init java byte array
Array = env->NewByteArray(10);
const char* NewBuffer = env->GetStringUTFChars(Buffer, 0);
// Set byte array region with the size of the SendData CommStruct.
// Now we can send the data back.
env->SetByteArrayRegion(Array, 0, 10, (jbyte*)NewBuffer);
env->ReleaseStringUTFChars(Buffer, NewBuffer);
// Return java array
return Array;
}
}
当我运行程序时,我在 c 端得到两个“AAAA”,但不是整个数组(所以没有“AAAAAAADD”)。我认为问题在于服务器一次发送 2 个“AAAA”而不是整个阵列。客户端崩溃并出现以下错误:
'boost::exception_detail::clone_impl >' what(): 读取:文件结束
java服务器发错数据了吗?谁能给我一个建议?欢迎所有反馈!
【问题讨论】:
标签: java android c++ boost tcp