2011-03-16 8 views
3

개체를 반환하는 Java 메서드를 호출하는 C++ 코드가 있습니다.JNI CallObjectMethod가 스택 프레임을 나사 고정합니까?

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; 
} 

이 메서드는 binding가 유효한 전역 Java 개체 참조이고 JSoundStream::m_getData이 다음 메서드의 메서드 ID 인 C++ 클래스 내부에 있습니다. 다음의 Java 클래스 :

public class TestStream extends JSoundStream { 
    [...] 

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

xxx43 임의로 C++에서 해당 메소드가 호출 될 때 JVM 내부에서 액세스 위반이 발생합니다. 때로는 제대로 작동하지만 때로는 액세스 위반이 발생합니다. CallObjectMethod 행을 제거하면 액세스 위반이 발생하지 않으므로 액세스 위반이 발생해야합니다. 디버그 목적으로 printfs를 삽입하면 이러한 액세스 위반이 더 많이 발생할 수 있습니다. 그게 나에게 벨을 울린다. 나는 무엇인가가 스택 프레임을 망쳐 놓고 있다는 것을 확신한다.

질문의 답은 다음과 같습니다 : 이 스택 프레임을 망칠 수 있습니까? 나는 의심스러운 것을 못 찾는다. 객체 메소드 호출을 제거하면 문제를 없애기 때문에 객체 메소드 호출과 관련이 있어야합니다.

내 C++ 코드는 __cdecl 호출 규칙 (사용중인 키 라이브러리에 연결하는 데 필요함)을 사용하여 컴파일되며 JNI 메서드는 __stdcall을 사용하지만 컴파일러 (MSVC++ 2008 Express)는 그것을 의식하고 "전환"을 처리하십시오, 그래서 나는 이것이 문제라는 것을 의심합니다. 그렇다면이 갈등을 어떻게 해결할 수 있을까요? 그렇지 않다면 무엇입니까?

답변

1

사용중인 포인터는 아마도 env입니다. jvm 포인터가 캐시 된 jvm->AttachCurrentThread(&env);을 호출하여 현재 스레드에 JVM을 연결해야합니다.