2014-03-28 2 views
0

몇 가지 기사를 읽은 후 대부분은 JNI에서 Android에서 C 코드를 내보내는 방법을 보여줍니다. 내 문제는 C++ 클래스에 많은 오버로드 된 함수가 있다는 것입니다. JNI를 사용하여 내보내기/감추기를 원한다면 - "extern"C를 건너 뛸 수 있다면 그렇게 할 수 있습니까? 내가 맞으면, 함수의 이름 맹 글링을 피하는 데 사용됩니다.Android - JNI에서 "extern"C가 필수입니까?

+0

@mah이 답변을 작성하십시오. [tag : c] 및 [tag : C++] 이외의 다른 태그는 질문과 전혀 관련이 없습니다. –

+0

@ πάνταῥεῖ answerd; 감사. – mah

+1

위키피디아는 JNI가 이름 맹 글링을 사용하지 않는다고 생각하는 것 같습니다. 따라서 JNI와 C++을 혼합 할 때 extern "C"가 필요할 것입니다. http://en.wikipedia.org/wiki/Java_Native_Interface – user3386109

답변

2

C 코드가 기호로 C++ 코드를 호출 할 수 있어야 할 때마다 이름 변환을 제거해야합니다. 컴파일하는 코드로 시작한다고 가정 할 때 관심있는 부분 주위의 extern "C"을 제거하십시오. 여전히 컴파일하면 안전합니다. .. 안전하지 않은 경우 링커에서 정의되지 않은 참조 오류가 발생합니다.

+0

답변 감사합니다. 나는 어려운 길을 배워야한다고 생각한다! extern을 제거하고 테스트! – Wajih

+3

올바른 생각이지만 "컴파일 중"은 충분한 테스트가 아닙니다. 포스터는 jni 라이브러리와 함께 작동합니다. 즉, 동적 링크는 런타임에 이름별로 수행됩니다. C++을 정적으로 호출하는 C 코드 (또는 이와 유사한)가 없으면 unworkably mangled 이름이 생성되어 라이브러리에 제대로 연결되지만 런타임시 jni가 동적 링커에게 해당 이름으로 메소드를 찾도록 요청할 때 실패합니다. –

+0

@ChrisStratton 예, 아주 좋은 지적입니다. – mah