안드로이드 개발 질문/답변
(글 수 45,052)
c로 작성된 소스가 있고.. 이것을 안드로이드 앱에서 사용하려고하는데요
ndk와 jni사용법은 숙지했으나.. unsatisfiedLinkError가 나네요
#include <jni.h>
jstring
Java_com_helloAndroid_HelloAndroid_synJNI(JNIEnv* env,jobject thiz)
{
if(!do_syn())
return (*env)->NewStringUTF(env,"nono");
return (*env)->NewStringUTF(env,"okok");
}
위와같은 c소스와 순수하게 c로만 구현된 또다른 c소스를 make파일에 같이 묶어서 ndk-builder로 *.so파일을 만들고있습니다.
순수하게 c로만 구현된 또다른 소스에 do_syn()이라는 함수가 존재하는거구요..
인터넷 찾다보니 이런 방식으로도 돌아가는걸 발견했는데 왜 안되는지 모르겠습니다.
(되는 소스는 c로만 이루어진 소스가 return 1; 하고 끝나긴합니다;;)
c로만 된 소스에서 raw소켓을 이용해서 패킷을 보내는 부분을 만들어놨는데..
이 소스도 위의 소스처럼 java를 가미한 문법으로 다 바꿔줘야 하는건가요?
답변 부탁드립니다
2013.03.06 13:59:50
unsatisfiedLinkError라면
Java_com_helloAndroid_HelloAndroid_synJNI() <--- 이녀석의 com_helloAndroid_HelloAndroid_ 부분은 안드로이드 프로젝트 패키지 입니다. 지금 실제 프로젝트를 개발 중이라면 저런 예제 패킷으로 하고 있지는 않으실 테고... 아마도 jni 샘플 돌려 보시고 코드를 그대로 복사해서 수정하신 모양입니다. 저부분을 본인의 패키지 명과 동일하게 해보세요. 만약 동일 한 데도 안 된다면 구글링을 더 해보시는 수 밖에 없네요.
2년전 질문이라 질문자 분은 안 보시겠지만, ㅎ 혹시 같은 에러로 고민하시는 분이 계실지도 모르니까... 뭐 그렇다고요 ㅜ.ㅜ
NDK를 이용해서 Native소스를 사용할때는 Java처럼 바꿔줄필요는 없구요 Jni를 이용해서 위에 예로 드신부분 처럼 Java와 Native를 연결해 주는 부분에서만 필요한 부분입니다.
소켓을 사용해서 패킷을 보내는 부분이 ndk에서 지원해주는 부분이 아니라면 별도로 Java쪽에서 같은 기능을 구현하시고 do_syn메소드 내부에서 Jni를 이용해서 호출해서 쓸수 있도록 변경 해주시던지 뭐 이런식으로 예외처리를 해주셔야 되지요.