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

I figured out how to convert a jbytearray to cli::array. Here is the code:

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 

I also had to convert a jstring to 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 に答える