2014-01-14 41 views
0

我正在開發一個充當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服務器發送數據錯了嗎?任何人都可以給我一個建議嗎?歡迎所有反饋!

回答

1

你是否願意發送數據或使JNI的東西工作? 在前一種情況下,使用Java將字符串轉換爲UTF-8(這將成爲英語的ASCII碼)。

文本byte [] - > byte []的轉換並不完全符合您的需要,我會得到這樣的想法:

//byte[] result; 
//byte[] source; 
String s = new String(source,"UTF-8"); 
result = s.getBytes("UTF-16LE"); 

對於第二種情況,我可以共享一部分工作代碼;它調用的Java從一種編碼轉換爲另一種

// it returns NULL in the case of an exception 
// the returned memory is calloc()'d; it's the caller's responsibility to free() it. 
char* changeEncoding(const char*source, int len, int direction) 
{ 
    JNIEnv* env = threadUnsafeInfo.env; 
    jobject obj = threadUnsafeInfo.obj; 

    if (!source) { 
    JNU_ThrowByName(env, "java/lang/NullPointerException", 0); 
    return NULL; 
    } 
    jbyteArray srcArray = env->NewByteArray(len); 

    jclass cls = env->FindClass("com/xyz/MyClass"); 
    jmethodID mid = env->GetMethodID(cls, "convert", "([BI)[B"); 

    if (mid != NULL && srcArray != NULL) { 
    env->SetByteArrayRegion(srcArray, 0, len, (jbyte*)source); 
    env->ExceptionClear(); 

    //jbyteArray resArray = (jbyteArray)env->CallStaticObjectMethod(cls, mid, srcArray, direction); 
    jbyteArray resArray = (jbyteArray)env->CallObjectMethod(obj, mid, srcArray, direction); 
    if(env->ExceptionOccurred()) { 
     DLOG("exception in convert ([BI)[B"); 
     env->ExceptionDescribe(); 
     //env->ExceptionClear(); // ?? 
     return NULL; 
    } 

    int resultLen = env->GetArrayLength(resArray); 
    char* result = (char*)calloc(2 + resultLen,1); // why 2: a bit of healthy paranoia ain't gonna hurt anyone 
    if (result == 0) { 
     JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0); 
     return NULL; 
    } 
    env->GetByteArrayRegion(resArray, 0, resultLen, (jbyte *)result); 
    env->DeleteLocalRef(cls); 
    env->DeleteLocalRef(resArray); 
    env->DeleteLocalRef(srcArray); 
    return result; 
    } else { 
    JNU_ThrowByName(env, "java/lang/NullPointerException", 0); 
    myassert(("method id = 0",0)); 
    } 
    return NULL; 
} 

在我手邊 我沒有使用jstrings代碼,喜歡的字節數組。

+0

嗨,謝謝你的回答!我想讓JNI的東西起作用,發送字符串數據實際上是我主要目標的踏腳石。那就是發送一個Opencv Mat(本地格式)變種android形式到我的TCP客戶端進行查看。你有什麼建議嗎? – Roy08

+0

謝謝!,是Mat變量問題的第二種情況的代碼?或我原來的問題? – Roy08

+0

代碼是工作代碼,但它不能解決您的問題。它只是一段使用SetByteArrayRegion()和GetByteArrayRegion()的工作代碼。 changeEncoding()JNI函數調用一個java函數,將文本從一種編碼轉換爲另一種編碼。它可能對你沒有用處。 – 18446744073709551615