안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
개발환경은 Windows + SDK8 + Cygwin 입니다.
libBB.so 안에서 libAA.so 안의 함수를 부르고 싶은데 잘 안되네요.
Android.mk 안에서는...
#-----------------
LOCAL_PATH := $(call my-dir)
# shared lib AA
include $(CLEAR_VARS)
LOCAL_MODULE := AA
LOCAL_SRC_FILES := AA.c
include $(BUILD_SHARED_LIBRARY)
# shared lib
include $(CLEAR_VARS)
LOCAL_MODULE := BB
LOCAL_SRC_FILES := BB.c
LOCAL_SHARED_LIBRARIES := AA # 이 부분을 잘못한 게 아닌가 의심됩니다.
include $(BUILD_SHARED_LIBRARY)
#-------------------
와 같이 썼습니다.
AA는 순수한 C 헤더와 함수이고, BB는 JNI 헤더 및 함수입니다.
BB 안에서 #include "AA.h" 를 하고 AA_func() 를 호출합니다.
ndk-build로 일단 두 so 파일 생성하는 건 됩니다만, 생성 자체가 잘 된건지는 모르겠네요.
잘못한거 같다고 의심된다고 한 부분이, 샘플코드의 two-libs를 살짝 고친 것인데,
two-libs 는 AA를 static로 하더군요. 근데 저는 여건상 AA, BB 둘 다 shared 로 해야합니다.
AA를 호출하는 shared 라이브러리 CC(역시 JNI)를 나중에 만들어 붙이도록 설계되어 있어서요...
즉 한 어플 내에서 jni BB와 jni CC가 동시에 순수c AA를 호출하는데, CC는 당장 붙지 않고 추후에 붙습니다.
감사합니다.
--- 추가합니다 ---
ndk-build 를 하면 so 파일 두개가 생기고 자동으로 프로젝트 폴더로 복사도 됩니다.
새로고침 하여서, 프로젝트상에 so 파일 두개가 모두 뜬 것도 확인했습니다만...
LogCat 다음과 같은 경고가 뜨고
08-10 05:18:10.645: INFO/dalvikvm(446): Unable to dlopen(/data/data/com.xxx.xxx/lib/libBB.so): Cannot load library: link_image[1995]: failed to link libBB.so
이제 뭔가 호출하면 바로 에러가 납니다.
다시 보니
libs
ㄴ armeabi
ㄴ gdb.setup
ㄴ gdbserver
ㄴ libAA.so
ㄴ libBB.so
obj
ㄴ local
ㄴ armeabi
ㄴ objs
| ㄴ AA
| ㄴ BB
ㄴ libBB.so
와 같이 나타나네요.
폴더를 확인해보니 obj/local/armeabi 안에 libAA.so도 있는데, 프로젝트에 안뜹니다. ㅠㅠ
2010.08.10 17:58:09
저랑 비슷한거 하시네요 ㅠㅠ
혹시 Android.mk에서 .SO파일만 불러다 컴파일 하는법 아시나요?
전 LOCAL_SHARED_LIBRARIES := AA BB 이런식으로 했는데..이게 맞는건지 모르겠네요
저도 .so로 컴파일은 되는데 실행시켜보면 SORRY창만 보고 있네요ㅠㅠ
답변을 해드려야되는데 질문에 질문을 달아서 죄송합니다..;;
2010.09.17 00:26:56
저도 이거 해보고 있습니다. 음.. NDK에 실제적인 파일을 인클루드 하는 부분에 so 파일 넣으신 다음에.. 예를 들면 libz.so 파일이 있는 곳..
jni 폴더에 h 파일 넣으시고.. 아니면 include 부분에 넣으셔도 되고. 그런 다음에 hello-gl2 예제를 참조하시면 so 파일을 참고하는게 나옵니다. 그렇게 참고 하시고 나면 될 것입니다.
저는 간단하게 twolib 를 변형했습니다. first 를 빌드 안 시킨 상태에서 so파일 추가 만으로 성공을 했습니다. 나중에 블로그에 후기를 남기도록 하겠습니다.
근데 소스를 보면 좀 이상하네요.. twolibs 를 약간 변형해서 shared로 바꾼다면 잘 될 겁니다. 제가 해봤습니다. 이클립스에서 F5를 안 누르신건 아닐련지.ㅇㅇ;;
jni 폴더에 h 파일 넣으시고.. 아니면 include 부분에 넣으셔도 되고. 그런 다음에 hello-gl2 예제를 참조하시면 so 파일을 참고하는게 나옵니다. 그렇게 참고 하시고 나면 될 것입니다.
저는 간단하게 twolib 를 변형했습니다. first 를 빌드 안 시킨 상태에서 so파일 추가 만으로 성공을 했습니다. 나중에 블로그에 후기를 남기도록 하겠습니다.
근데 소스를 보면 좀 이상하네요.. twolibs 를 약간 변형해서 shared로 바꾼다면 잘 될 겁니다. 제가 해봤습니다. 이클립스에서 F5를 안 누르신건 아닐련지.ㅇㅇ;;
혹시 so가 물고 있는 AA라는 so를 못 찾는게 문제라면...
JAVA소스에서 AA.so, BB.so 둘다 로드 하셔야 합니다.
(안그러면 물고 물리는 so를 못찾더군요.)