将jByteArray转换为.NET byte []时遇到问题

时间:2013-04-11 19:32:56

标签: java-native-interface c++-cli

我在使用JNI时遇到了问题,并且已经在这个问题上停留了很长时间。我以前发过这个帖子,但是从来没有得到答案,从现在开始做了很多研究。

我的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#byte []。我听说过如何转换jbyte *对象,但无法弄清楚如何将其转换为正确的格式。

2 个答案:

答案 0 :(得分: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转换为System :: String ^ ...

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 :(得分:-1)

如果没有答案,则意味着(a)没有人知道,(b)没人关心(在C ++下发布.net内容是一种确定的方法。发布一条易于修复的错误消息是另一个。),或者(c)它可能是一个案例“OP究竟要做什么?!这没有任何意义。不,没有头,也没有尾巴。继续......”