我正在開發一個充當TCP服務器/客戶端的Android應用程序,我想從應用程序發送數據到用c/C++編寫的服務器/客戶端(使用boost libraray)。我有一個要求串converstion到字節的本地C函數一個普通的Java功能:發送java字符串爲c/C++字節
爲遵循的函數定義(本機的功能是字符串轉換:
// 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字節,如隨後它被定義爲:
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;
}
}
W¯¯如果我運行程序,我會在c端獲得兩個「AAAA」,但不能作爲一個整體數組(因此沒有'AAAAAAAADD)。我認爲問題在於服務器發送2'AAAA',而不是一次發送整個數組。客戶端崩潰並出現以下錯誤:
'的boost :: exception_detail :: clone_impl>' 什麼():讀:文件
的一方是Java服務器發送數據錯了嗎?任何人都可以給我一個建議嗎?歡迎所有反饋!
嗨,謝謝你的回答!我想讓JNI的東西起作用,發送字符串數據實際上是我主要目標的踏腳石。那就是發送一個Opencv Mat(本地格式)變種android形式到我的TCP客戶端進行查看。你有什麼建議嗎? – Roy08
謝謝!,是Mat變量問題的第二種情況的代碼?或我原來的問題? – Roy08
代碼是工作代碼,但它不能解決您的問題。它只是一段使用SetByteArrayRegion()和GetByteArrayRegion()的工作代碼。 changeEncoding()JNI函數調用一個java函數,將文本從一種編碼轉換爲另一種編碼。它可能對你沒有用處。 – 18446744073709551615