2012-06-04 4 views
2

공개 된 JNI 기능/메소드로 NDK 컴파일 된 공유 라이브러리를 통해 사용할 수있는 모든 기능을 표시하는 방법을 아는 사람이 있습니까?JNI 공유 라이브러리에서 함수를 찾으십니까?

나는 그 메소드에 액세스해야하는 lib * jni.so 파일이 있습니다. nm -Dg lib 사용 * jni.so는 공유 라이브러리 내에있는 모든 심볼을 출력합니다. JNI 훅으로 정의 된 것들만 찾고 있습니다.

감사합니다, 기본 방법과의 .class 파일에 케빈

답변

4

알아내는 데 사용할 수있는 몇 가지 트릭이 있습니다.

  1. 해당 .class 파일을 검사하십시오. 라이브러리의 .class 파일이있는 경우 Eclipse에서 열어서 native 키워드를 검색하여 네이티브로 구현 된 것으로 표시된 메소드를 확인할 수 있습니다.

  2. 모든 문자열을 덤프하려면 strings 명령을 사용하십시오. 라이브러리가 Java 메소드 이름 등의 런타임 연결을 수행하지 않는 한 (있을 법하지 않음)으로 .so에서 참조되는 대부분의 Java 메소드 및 클래스를 나열 할 수 있어야합니다. regexps를 사용하면 흥미로운 문자열을 필터링 할 수 있습니다. 예를 들어 strings lib*jni.so | grep 'L[^;]*;'은 .so에서 참조하는 모든 클래스를 나열합니다 (예 : Lcom/somecompany/project/SomeClass;). 메서드를 클래스와 일치시키는 것은 아마도 까다로운 일일 것입니다. 그러나 필요에 따라 아마도 충분할 것입니다.

  3. 네이티브 메서드가 등록 될 때마다 logcat 메시지를 인쇄하는 Dalvik VM 버전을 빌드하십시오. 이것은 가장 진보되고 시간이 많이 걸리지 만 가장 정확한 것입니다. 간단하게 안드로이드 에뮬레이터를 구축 http://source.android.com/source/index.html의 지시에 따라,하지만 당신은 구축하기 전에, 그래서이된다 dalvik/vm/Jni.cppdvmRegisterJNIMethod의 끝에서 디버그 인쇄 사용 : LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);

1

실행 javap.

관련 문제