서적에 관한 질문 및 오류 등을 문의 할 수 있으며, 저자로부터 직접 답변을 받을 수 있습니다.
안녕하세요.
현재 진행중인 프로젝트 때문에 NDK책을 사서 참조 하고 있습니다.
- Target Board : TCC8930 SDK 개발 보드
+ 제조사 : 텔레칩스
+ Chip : TCC8930
+ Android : 젤리빈
NDK 책의 내용중에 외부 라이브러리 확용하기 란에서 책의 sample 을 테스트 하면 정상적으로
라이브러리 <--> 라이브러리 사이의 함수 호출이 잘 되고 있습니다.
궁금한것은 지금 테스트 하고 있는 내용이 JNI를 통해서 Platform내부 *.so 내부에 있는 함수를 호출 하고
싶어서 간단하게 테스트 해보는데 error:undefined reference to '<function name>' 발생하고 있습니다.
"android_root/hardware/telechips/.../extenddisplay" 이쪽 소스에 있는 함수를 호출 하는것인데. 계속 에러가 발생하
고 있어서 질문드립니다.
grep으로 확인하면 so파일 내부에는 해당 함수가 존재하는데 error가 발생하느 원인을 모르겠습니다.
안녕하세요.
댓글 보고 여러가지 확인 해봤는데요.
고도리 님이 말씀하신데로 해당 라이브러리는 추가 된상태이고요.
LOCAL_SHARED_LIBRARIES := \
libextenddisplay \
libdzonetest \
libcutils \
libutils
쭈암님이 말씀하신데로 link를 걸어도 undefined reference error가 발생하네요.
확인차원에서 android_root/hardware/.../extenddisplay/extenddisplay.cpp 파일에 테스트 함수를 아래 처럼 추가하였습니다.
$vi extenddisplay.cpp
....
int callfunctest(int a, int b)
{
return a+b;
}
출력 결과는 여전히 undefined reference to 'callfunctest' 라고 출력되네요.
libextenddisplay.so 파일을 "grep -re callfunctest *"로 검색하면 라이브러리 내부에는 있다고 합니다.
root@ubuntu:/mnt/android_tcc/s20/tcc_s20_jb/out/target/product/tcc8930st/system/lib# grep -re callfunctest libextenddisplay.so Binary file libextenddisplay.so matches |
문제점을 찾았습니다.
결론은 단순한 부분에서 비롯되어 네요.
A(작성한 LIB) -> B(플랫폼 LIB)
A의 작성한 LIB(JNI lib)쪽에서 extern "C" int callfunctest(int a, int b); 이렇게 하였는데.
B의 플랫폼 LIB 코드에도 extern "C" int callfunctest(int a, intb); 이렇게 선언을 해야 합니다.
따라서, 플랫폼 LIB의 해당 directory에 가서 header파일 하나 만들어서
#ifdef __cplusplus extern "C" { #endif int callfunctest(int a, int b); #ifdef __cplusplus } #endif |
추가해준다음
작성한 LIB쪽 Android.mk 내부에 아래 코드 추가해줬습니다.
LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ hardware/....../common/extenddisplay |
tcc8930에서 특별하게 사용하는 hdmi용 output 함수가 있는 듯 합니다.
이 함수가 포함되어 있는 library 이름을 찾아서 Android.mk 파일에 추가해 주시면 될겁니다.