JNI-在执行本机代码期间,与目标VM断开连接
JNI - Disconnected from the target VM, during the execution of native code
我在执行程序时遇到一个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的方式是不正确的。
有人能告诉我哪里出了问题,以及克服这个问题的可能方法吗。
这看起来不正确:
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代码。
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++A*算法并不总是在路径中具有目标节点
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 为测试目标创建具有不同源文件夹的文件
- 使用源向量作为目标
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 在 CMake 中为每个目标设置编译器/链接器标志
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 CMake 中对目标依赖项进行分组?
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何为包含头文件的目标编写生成文件?
- 线性优化目标函数中的绝对值
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 字符串函数在目标C++上运行时C++返回空
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 请求最简单的 OpenMP 目标 GPU 示例
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- JNI-在执行本机代码期间,与目标VM断开连接