JVM-Crash 在 JNI 中调用 ReleaseStringUTFChars,仅在 Windows 7 上,Win
JVM-Crash in JNI call ReleaseStringUTFChars, only on Windows 7, Windows XP fine
以下是通过JNI从Java JVM调用C++代码的摘录:
(JNIEnv *pJniEnv, jobject, jstring pDllName)
{
string dllName(pJniEnv->GetStringUTFChars(pDllName, NULL));
// stuff happens here like
HINSTANCE loadedDll = LoadLibrary(dllName.c_str());
pJniEnv->ReleaseStringUTFChars(pDllName, dllName.c_str());
return ...;
}
这在Windows XP中有效,但在Windows 7中崩溃,并出现访问冲突异常,在行中
pJniEnv->ReleaseStringUTFChars(pDllName, dllName.c_str());
错误消息是:
java 中的首次机会0x77355F29异常 (ntdll.dll) .exe: 0xC0000005:访问冲突读取位置0x002B0D52。
我会感谢任何线索。
JRE 版本:6.0_27-b07,Java VM:Java HotSpot(TM) Client VM (20.2-b06 mixed mode windows-x86),C++ 代码是使用 Visual Studio 2010 构建的。
GetStringUTFChars()
的文档指出:
返回指向字符串的 UTF-8 字符数组的指针。 此数组在 ReleaseStringUTFChars 发布之前有效。
ReleaseStringUTFChars()
状态的文档(其中 string
是第一个参数,utf
是第二个参数):
通知虚拟机实现本机代码没有 更长需要访问本机字符串 UTF。utf 参数 是使用 GetStringUTFChars 从字符串派生的指针。
在发布的代码中,dllName.c_str()
作为第二个参数传递给ReleaseStringUTFChars()
这是不正确的c_str()
因为它归dllName
所有(std::string
的构造函数会复制其参数),而不是从pDllName
派生出来的。这在一个平台上而不是另一个平台上工作的事实表明了未定义的行为。
要更正:
const jbyte* pDllName_string = pJniEnv->GetStringUTFChars(pDllName, NULL);
std::string dllName(pDllName_string);
pJniEnv->ReleaseStringUTFChars(pDllName, pDllName_string);
/* Use 'dllName' */
相关文章:
- 在Windows上用C++裁剪HBITMAP
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 如何用参数值调用函数(仅在运行时已知)
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在Windows中以.exe的形式运行c++
- 无法在windows控制台中为C++程序提供必要的输入
- GSTREAMER管道播放,但没有填充的回调(仅在Android上发生,在Windows和Linux上可行)
- C++应用程序仅在使用本地 Windows 调试器时运行,而不是哪个 exe 文件
- 是否可以仅在Windows上使用Clang编译C ++
- 仅使用boost.datetime在Windows上有错误
- 仅在Windows Phone目标中0x8007007E
- 错误:没有匹配的成员函数调用 'upper_bound' =>仅在 macOS 上 => Windows 和 Linux 都很好
- Windows App:仅在应用程序的一部分中渲染DirectX
- Boost ::格式仅在Windows下
- C 链接列表仅在GNU/Linux而非Windows中导致分割故障
- JVM-Crash 在 JNI 中调用 ReleaseStringUTFChars,仅在 Windows 7 上,Win
- JsonCpp 仅在 Windows 中出现模糊的重载
- 在UTF-8内部工作,然后仅在Windows中需要时转换为UTF-16,是否存在任何危险
- QtSerialPort有不可用的数据,分割故障仅在Windows 8下
- 错误"msvcr100.dll"(仅在Windows 7和Vista上),即使在静态链接(/MT)之后