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

本文关键字:目标 VM 断开 连接 执行 本机代码 JNI- | 更新日期: 2023-09-27 17:57:49

我在执行程序时遇到一个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;
}

确切地说,我认为将托管的无符号字符转换为jbyteArray的方式是不正确的。

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

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

这看起来不正确:

    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);

由于不熟悉使用"^"的C++/CLI语法,我主要关注jbyteArray和SetByteArrayRegion()调用。jbyteArray是指针的别名。鉴于此,对SetByteArrayRegion()的调用是不正确的。应该是:

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

您也可以在代码的其他部分中检查&array的其他用法。同样,我不熟悉"^"语法的细微差别,但使用了传统的C++来实现JNI代码。