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
무엇이'AMT_EXPORT'입니까? 매크로 이름처럼 보입니다. '&'로 평가하면 문제가 발생합니다. –
죄송합니다. 정의를 추가했습니다. –
두 DLL이 동일한 C++ 런타임 DLL에 링크되어 있습니까? 그렇지 않다면, 당신의 C++은 자바의 유무에 관계없이 거의 추락 할 것이라고 확신합니다. –