gpt4 book ai didi

java - JNI CallObjectMethod 搞砸了堆栈框架?

转载 作者:太空狗 更新时间:2023-10-29 23:09:24 26 4
gpt4 key购买 nike

我有 C++ 代码调用返回对象的 Java 方法:

virtual bool OnGetData(sf::SoundStream::Chunk& data) {
jobject jchunk = env->CallObjectMethod(binding, JSoundStream::m_getData);
if(jchunk) {
//... some processing code will go here in the future
return true;
}
return false;
}

此方法位于 C++ 类内部,其中 binding 是有效的全局 Java 对象引用,JSoundStream::m_getData 是以下方法的方法 ID以下 Java 类:

public class TestStream extends JSoundStream {
[...]

@Override
public Chunk getData() {
return null; //testing
}
}

当从 C++ 调用该方法时,我随机在 JVM 中遇到访问冲突。有时它工作正常,有时我会遇到访问冲突。删除 CallObjectMethod 行永远不会导致访问冲突,因此它一定是访问冲突的来源。出于调试目的插入 printfs 会使这些访问冲突更有可能发生。这给我敲响了警钟:我很确定有什么东西搞砸了堆栈框架。

现在的问题是:什么可能会搞砸堆栈框架?我找不到任何可疑的东西。它一定与对象方法调用有关,因为删除它可以解决任何问题。

我的 C++ 代码是使用 __cdecl 调用约定(链接到我正在使用的 keystore 所必需的)编译的,JNI 方法使用 __stdcall,但据我所知,编译器 (MSVC++ 2008 Express) 应该知道它并处理“转换”,所以我怀疑这是问题所在。如果是,我将如何解决这个冲突?如果不是,那是什么?

最佳答案

它可能是您正在使用的 env 指针。您必须通过调用 jvm->AttachCurrentThread(&env); 将 JVM 附加到当前线程,其中 jvm 指针已被缓存。

关于java - JNI CallObjectMethod 搞砸了堆栈框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com