以下是Java通过JNI调用的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中有效,但在Windows 7中崩溃,但在行中出现访问冲突异常。
pJniEnv->ReleaseStringUTFChars(pDllName, dllName.c_str());
错误信息是:
第一次机会异常在0x77355F29 (ntdll.dll)在java.exe: 0xC0000005:访问冲突读取位置0x002B0D52。
我会感激任何线索的。
JRE版本: 6.0_27-b07,Java : Java HotSpot(TM)客户端VM (20.2-b06混合模式windows-x86 ),C++代码是用Visual 2010构建的。
发布于 2012-10-12 15:05:37
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' */
https://stackoverflow.com/questions/12861574
复制相似问题