C# JNI-在执行本机代码期间与目标VM断开连接

C# JNI-在执行本机代码期间与目标VM断开连接,c#,java,c++,java-native-interface,c++-cli,C#,Java,C++,Java Native Interface,C++ Cli,我在执行程序时遇到一个Java异常错误。尽管java捕获了异常,但它继续执行本机代码,而没有给出预期的结果 以下是本机代码,我猜它有问题:- System::Collections::Generic::List<cli::array<unsigned char>^>^ processImages(unsigned char* frontImage, unsigned char* backImage); jbyteArray convertUnsignedCharIntoJ

我在执行程序时遇到一个Java异常错误。尽管java捕获了异常,但它继续执行本机代码,而没有给出预期的结果

以下是本机代码,我猜它有问题:-

System::Collections::Generic::List<cli::array<unsigned char>^>^ processImages(unsigned char* frontImage, unsigned char* backImage);
jbyteArray convertUnsignedCharIntoJByteArray(JNIEnv *env,array<unsigned char>^ inputArray);
unsigned char* convertJByteArrayIntoUnsignedChar(JNIEnv *env, jbyteArray inImage);

JNIEXPORT jobject JNICALL Java_com_me_NativeCaller_processImages
(JNIEnv *env, jclass c, jbyteArray front, jbyteArray back){
    unsigned char* frontBuffer = convertJByteArrayIntoUnsignedChar(env, front);
    unsigned char* backBuffer = convertJByteArrayIntoUnsignedChar(env, back);

    jbyteArray intermediateArray1 = convertUnsignedCharIntoJByteArray(env,(array<unsigned char>^)returnedValue[0]);
    jbyteArray intermediateArray2 = convertUnsignedCharIntoJByteArray(env,(array<unsigned char>^)returnedValue[1]);

    int aLen1 = strlen(reinterpret_cast<const char*>(&intermediateArray1));
    int aLen2 = strlen(reinterpret_cast<const char*>(&intermediateArray2));

    jbyteArray finalArray = env->NewByteArray(2);
    env->SetByteArrayRegion(finalArray,0,1,(jbyte*)&intermediateArray1); 
    env->SetByteArrayRegion(finalArray,1,2,(jbyte*)&intermediateArray2);
    return static_cast<jobject>(finalArray);
}

/*takes an array<unsigned char>^ as input and convert it into a jbyteArray*/
jbyteArray convertUnsignedCharIntoJByteArray(JNIEnv *env,array<unsigned char>^ inputArray){
    int aLen = strlen(reinterpret_cast<const char*>(&inputArray));
    jbyteArray intermediateArray = env->NewByteArray(aLen);
    env->SetByteArrayRegion(intermediateArray,0,aLen,(jbyte*)&inputArray);
    return intermediateArray;
}
System::Collections::Generic::List^processImages(无符号字符*frontImage,无符号字符*backImage);
jbyteArray convertUnsignedCharIntoJByteArray(JNIEnv*env,数组^inputArray);
无符号字符*convertJByteArrayIntoUnsignedChar(JNIEnv*env,JbyteArrayInImage);
JNIEXPORT作业对象JNICALL Java\u com\u me\u NativeCaller\u processImages
(JNIEnv*env,jclass c,前面是jbyteArray,后面是jbyteArray){
unsigned char*frontBuffer=convertjbyteraryintounsignedchar(env,front);
unsigned char*backBuffer=convertjbyteraryintounsignedchar(env,back);
jbyteArray intermediateArray1=convertUnsignedCharIntoJByteArray(env,(array^)returnedValue[0]);
jbyteArray intermediateArray2=convertUnsignedCharIntoJByteArray(env,(array^)returnedValue[1]);
int aLen1=strlen(重新解释铸件和中间铸件1));
int aLen2=strlen(重新解释铸件和中间铸件2));
jbyterarray finalArray=env->newyterarray(2);
env->SetByteArrayRegion(最终版本,0,1,(jbyte*)和intermediateArray1);
env->SetByteArrayRegion(最终版本1,2,(jbyte*)和中间版本2);
返回静态_-cast(finalArray);
}
/*将数组^作为输入并将其转换为jbyteArray*/
jbyteArray convertUnsignedCharIntoJByteArray(JNIEnv*env,数组^inputArray){
int aLen=strlen(重新解释和输入);
jbyteArray intermediateArray=env->newytearray(aLen);
env->SetByteArrayRegion(中间数组,0,aLen,(jbyte*)和输入数组);
回程回程;
}
确切地说,我认为将有管理的无符号字符转换为jbyteArray的方法是不正确的

谁能告诉我哪里出了问题,以及克服这个问题的可能方法。

这看起来不正确:

    jbyteArray intermediateArray1 = convertUnsignedCharIntoJByteArray(env,(array<unsigned char>^)returnedValue[0]);
    jbyteArray intermediateArray2 = convertUnsignedCharIntoJByteArray(env,(array<unsigned char>^)returnedValue[1]);

    //...

    env->SetByteArrayRegion(finalArray,0,1,(jbyte*)&intermediateArray1); 
    env->SetByteArrayRegion(finalArray,1,2,(jbyte*)&intermediateArray2);

您还可以在代码的其他部分检查
和array
的其他用法。同样,我不熟悉“^”语法的细微差别,但已经用传统的C++实现了JNI代码。

代码>数组^输入数组< /Cord>这是什么“^”事情?我不太清楚。我在一个示例代码中找到它,这不是传统的C++代码。看起来像是C++/CLI语法。您应该相应地标记您的问题。您是否检查了aLen1和aLen2的值是否合理?在我看来,你所做的任何事情都是可疑的。它很可能只是
somearray
。显然它有点混乱。但我想它在语法上是正确的。也许是因为我误用了一个参考资料。
    env->SetByteArrayRegion(finalArray,0,1,(jbyte*)intermediateArray1); 
    env->SetByteArrayRegion(finalArray,1,2,(jbyte*)intermediateArray2);