2012-10-29 5 views
0

C++로 구현 된 일부 기본 메서드를 JNI를 통해 호출하는 간단한 Java 클래스가 있습니다.문자열을 JNI로 전달할 때 액세스 위반 ((0xc0000005))

자바 코드는 자바 프로그램에서 직접 호출 testString2의 구현은 하나의 DLL에이

String in_test="./xml/input/imagen_0023.xml"; 
//String in_test="avc"; 
String out_test=acr.testString2(in_test); 
System.out.println("test: " + out_test); 

처럼 보인다. testString2 메소드의 정의는 다음과 같습니다.

JNIEXPORT jstring JNICALL Java_com_accsa_ocr_AutomaticCharacterRecognition_testString2(JNIEnv *env, jobject obj, jstring string) 
{ 
    const char *str = env->GetStringUTFChars(string, 0); 

    //std::string s=amt_test_string(str); 
    std::string s="hello: "+(std::string)str; 
    env->ReleaseStringUTFChars(string, str); 
    return env->NewStringUTF(s.c_str()); 
} 

호출 된 amt_test_string는 다른 곳에서 정의 된 (다른 DLL) :

std::string AMT_EXPORT amt_test_string(std::string in) 
{ 
    std::string s="path: "+in; 
    std::cout<<s<<std::endl; 
    return s; 
} 

나는 (이 그것을 깔끔하게 작동하지만,에서 곧 내가 표준 : : 문자열의 = amt_test_string의 주석으로처럼 실행하는 경우

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77ae2cc7, pid=8072, tid=7328 
# 
# JRE version: 7.0_09-b05 
# Java VM: Java HotSpot(TM) Client VM (23.5-b02 mixed mode, sharing windows-x86) 
# Problematic frame: 
# C [ntdll.dll+0x52cc7] RtlFreeHeap+0xcd 

을하지만 행동은 어떻게 든 불규칙 : STR) 다음과 같이 나는 액세스 위반 오류가 발생합니다. 입력 인수의 길이를 줄이면 (예 :

//String in_test="avc"; 

) 프로그램이 다시 작동합니다. 인터넷 검색을 통해 배웠던 것에서는 스택이 할당 된 변수를 사용하는 것과 관련된 것이지만이를 디버깅하는 방법을 알지 못합니다.

편집 1 : AMT_EXPORT 매크로 심볼을 수출 만하는 편리한 바로 가기입니다 : 나는 윈도우 7 32 비주얼 스튜디오 2010과 오라클의 JDK 1.7.09

EDIT 2 비트에이를 컴파일하고있다. 난 당신이 const char *

std::string s="hello: "+(std::string)str; 

std::string에이 해당 표준 : : 문자열의 생성자를 호출하는 것으로 교체 캐스트한다고 생각하지 않습니다

#ifdef WIN32 
    #ifdef AMT_EXPORTS 
     #define AMT_EXPORT __declspec(dllexport) 
    #else 
     #define AMT_EXPORT __declspec(dllimport) 
    #endif 
#else 
    #define AMT_EXPORT 
#endif 
+2

무엇이'AMT_EXPORT'입니까? 매크로 이름처럼 보입니다. '&'로 평가하면 문제가 발생합니다. –

+0

죄송합니다. 정의를 추가했습니다. –

+0

두 DLL이 동일한 C++ 런타임 DLL에 링크되어 있습니까? 그렇지 않다면, 당신의 C++은 자바의 유무에 관계없이 거의 추락 할 것이라고 확신합니다. –

답변

0

디버깅 JNI 코드의 경우 this article에 게시 된 메소드가 유용 할 수 있습니다.이 코드는 Netbeans과 Visual Studio를 사용하여 JNI를 디버깅하는 데 유용합니다. 간단합니다. Java 프로그램을 시작한 다음 Visual Studio에서 Debug -> Attach to process를 선택하고 프로그램을 실행하는 java.exe 프로세스를 선택하십시오.

C++ 코드에 중단 점을 추가하면 Visual Studio에서 중단 점을 중단시킵니다. Voila :)

1

: 아래의 정의를 참조 해주세요.

+0

나는 너에게 동의하고, 나는 그것을 시도했다. 그러나 그것이 문제의 원인이 아닙니다. –

관련 문제