2013-04-11 73 views
0

我在使用JNI時遇到了問題,並且在此問題上停留了相當長時間。之前我曾發佈過這方面的消息,但從未收到過答案,並且偶爾會進行大量的研究。在將jByteArray轉換爲.NET字節時出現問題[]

我JNI簽名:

JNIEXPORT void JNICALL Java_MyApplet_invokeManager(JNIEnv *jniEnvPtr, jobject javaObj, jbyteArray encodedData) 

我的一些代碼:

boolean isCopy; 
jbyte* bytes = jniEnvPtr->GetByteArrayElements(encodedData, &isCopy); 
jniEnvPtr->ReleaseByteArrayElements(encodedData, bytes, JNI_ABORT); 
myManager->ShowQueue(encodedData); 

錯誤消息:

error C2664: 'MyModule::JniToManaged::ShowFormQueue' : cannot convert parameter 2 from 'jbyte *' to 'cli::array<Type,dimension> ^' 

我發現沒有辦法將其轉換爲C#的字節[]我需要通過。我聽說過投射jbyte *對象,但無法弄清楚如何將其轉換爲正確的格式。

回答

1

我想了解如何將jbytearray轉換爲cli :: array。下面是代碼:

jbytearray jArray; //my array 
jint len = jniEnvPtr->GetArrayLength(jArray); //get length 

boolean isCopy; 
jbyte* b = jniEnvPtr->GetByteArrayElements(jArray, &isCopy); //get pointer 
array<byte, 1> ^myArray = gcnew array<byte, 1>(len); //create the cli::array 

//loop through jbytearray and copy elements into our cli::array 
for(int i = 0; i < len; i++) 
{ 
    myArray[i] = b[i]; 
} 
jniEnvPtr->ReleaseByteArrayElements(jArray, b, JNI_ABORT); // release 

我也只好到的jstring轉換爲系統:字符串^ ...

jboolean blnIsCopy; 
jstring jstrOutput; 

//jstring to char* 
const char* strA = (jniEnvPtr)->GetStringUTFChars(theJString, &blnIsCopy); 

//char* to std::string 
std::string standardStr(strA); 

//std:string to System::String^ 
System::String^ str2 = gcnew System::String(standardStr.c_str()) 
MessageBox(NULL, standardStr.c_str(), "Report Name!", MB_OK); 
jniEnvPtr->ReleaseStringUTFChars(theJString, strA); 
+1

您應該在轉換結束時調用'ReleaseStringUTFChars',否則可能導致'jstring'對象被無限期地固定,導致內存碎片,或者C++副本被無限期保留,導致內存泄漏。 – GooseSerbus 2013-04-15 21:54:25

+0

啊,感謝您的支持。我記得把它叫做jbytearray,只是忘了它的字符串。 – gwin003 2013-04-17 17:42:51

-1

如果沒有答案,它意味着(a)沒有人知道,(b)沒有人關心(發佈.net在C++下的東西是一種肯定的消防方式,那麼應該很容易解決的錯誤消息是另一個),或者(c)它可能是「OP試圖做什麼的事情?!這沒有任何意義,沒有,沒有頭,也沒有尾巴,移動...」

+2

如果我有足夠的代表,我會投下來。如果你沒有任何建設性的貢獻,我真的不認爲即使發佈這一點。 – gwin003 2013-04-12 15:01:42