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

Posted

技术标签:

【中文标题】JNI - 在执行本机代码期间与目标 VM 断开连接【英文标题】:JNI - Disconnected from the target VM, during the execution of native code 【发布时间】:2014-04-11 10:18: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;

确切地说,我认为我将 manged unsigned char 转换为 jbyteArray 的方式不正确。

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

【问题讨论】:

array&lt;unsigned char&gt;^ inputArray 那个“^”在那里做什么? 我不太清楚。我在示例代码中找到了它。 嗯,这不是“传统”的 C++ 代码。它看起来像 C++/CLI 语法。您应该相应地标记您的问题。 您检查过 aLen1 和 aLen2 的值是否合理?你在&amp;somearray 所做的任何地方都对我来说很可疑。它很可能应该只是somearray 显然有点混乱。但我猜它在语法上是正确的。可能是因为我误用了参考文献。 【参考方案1】:

这看起来不正确:

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

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

【讨论】:

以上是关于JNI - 在执行本机代码期间与目标 VM 断开连接的主要内容,如果未能解决你的问题,请参考以下文章

通过 JNI 执行 OpenCV 本机函数的问题

使用gdbserver从clion调试jni库

Android JNI 学习:JNI 简介

在调用本机方法 MoveWindow 期间闪烁

如何在android的jni线程中实现回调

JNI异常处理和缓存策略