我在使用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 *对象,但无法弄清楚如何将其转换为正确的格式。
答案 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究竟要做什么?!这没有任何意义。不,没有头,也没有尾巴。继续......”