2013-04-11 76 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