0

我在使用 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* 对象,但不知道如何将其转换为正确的格式。

4

2 回答 2

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);
于 2013-04-12T15:00:42.617 回答
-1

如果没有答案,则意味着 (a) 没人知道,(b) 没人关心(在 C++ 下发布 .net 内容是到达那里的可靠方法。发布应该易于修复的错误消息是另一种方式。),或(c)可能是“OP到底想做什么?!这没有任何意义。不,没有头也没有尾。继续……”

于 2013-04-11T21:58:19.707 回答