2010-08-02 7 views
0

현재 프로젝트에서 JNI로 작업 중이며 컴파일하는 동안 C++ 코드에서 이상한 오류가 발생합니다.
C++ 오버로드 된 함수 오류

오류 : 나는라는 오류 받기가 C로 매핑 자바의 기능을 인 다음 배열에서 "nativegetsupportedciphersuites"라인에서 오는 어떤 상황에 맞는 유형 정보

오버로드 기능을 ++ 대응. 다른 배열 구성원을 더 쉽게 읽을 수 있도록 잘라 냈습니다.

static JNINativeMethod sSocketImplMethods[] = 
{ 
... 
    {"nativegetsupportedciphersuites", "()[Ljava/lang/String;", (void*)&Java_mypackage_SocketImpl_nativegetsupportedciphersuites}, 
... 
}; 


가 나는 유형 선언에 오류해야합니다 생각하지만 정말 단서가 없다. 형식 선언은 javah 함수에 의해 생성되었으므로 올바른 것으로 가정합니다. 위의 메서드의 함수 시그니처는 다음과 같습니다.

JNIEXPORT jobjectArray JNICALL Java_mypackage_nativegetsupportedciphersuites(JNIEnv* env, jobject object) 


아무 생각?

크리스

답변

1

오류 메시지는 메서드가 오버로드되었음을 나타냅니다. 컴파일러는 매개 변수 정보가 없으므로 포인터를 가져 가고 싶은 오버로드를 파악할 수 없습니다.

메서드 오버로드를 원하지 않는 것 같습니다. 그 방법에 대한 두 번째 선언이 있습니까? 머리글과 본문에서 똑같은 서명을 사용하고 있습니까?

+0

감사합니다. JSBangs! 내 헤더 선언에 약간의 차이가있었습니다. – Chrisc

0

일반적으로 함수 포인터를 void *로 캐스트하면 안됩니다. 일부 플랫폼은 void *에 함수 포인터를 맞출 수 없습니다. 제네릭 함수 포인터 유형은 'void (*)()'이지만, 이 올바른 유형으로 캐스트 되어야만 스택 손상을 방지하는 함수를 호출해야합니다.

오류는 .cpp 파일의 서명이 javah가 생성 한 .h 파일의 서명과 정확하게 일치하지 않기 때문에 Java_mypackage_nativegetsupportedciphersuites에 대해 두 가지 다른 오버로드가 표시 될 수 있음을 나타내므로 당신이 캐스팅하려는 타입을 기반으로 원하는 것 (단지 void * 임).

소스 파일에서 'extern'C ''을 올바르게 가져 왔습니까?