首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JVM- JNI调用ReleaseStringUTFChars时崩溃,仅在Windows7上,Windows很好

JVM- JNI调用ReleaseStringUTFChars时崩溃,仅在Windows7上,Windows很好
EN

Stack Overflow用户
提问于 2012-10-12 14:47:15
回答 1查看 3.5K关注 0票数 2

以下是Java通过JNI调用的C++代码的摘录:

代码语言:javascript
运行
复制
(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中崩溃,但在行中出现访问冲突异常。

代码语言:javascript
运行
复制
 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构建的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中剥离出来。这一事实在一个平台上运行,而不是在另一个平台上工作,这意味着没有定义的行为。

纠正:

代码语言:javascript
运行
复制
const jbyte* pDllName_string = pJniEnv->GetStringUTFChars(pDllName, NULL);
std::string dllName(pDllName_string);
pJniEnv->ReleaseStringUTFChars(pDllName, pDllName_string);

/* Use 'dllName' */
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12861574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档