2012-06-04 2 views
2

Кто-нибудь знает, как показать все функции, доступные через скомпилированную разделяемую библиотеку NDK, с публичными функциями/методами JNI?Найти функции в общей библиотеке JNI?

У меня есть файл lib * jni.so, который мне нужен для доступа к его методам. Использование nm -Dg lib * jni.so выводит все символы, найденные в общей библиотеке. Я ищу только те, которые определены как крючки JNI.

Спасибо, Kevin

ответ

4

Есть несколько трюков, которые вы могли бы использовать, чтобы найти это.

  1. Осмотрите соответствующие файлы .class. Если у вас есть файлы .class для библиотеки, вы можете открыть их в Eclipse и найти ключевое слово native, чтобы узнать, какие методы были объявлены для реализации в native.

  2. Используйте команду strings, чтобы сбросить все строки. Если библиотека не выполняет конкатенирование имен методов Java и т. Д. (Маловероятно), вы должны иметь возможность перечислять большинство методов и классов Java, ссылающихся на .so на strings. Используя регулярные выражения, вы можете отфильтровать интересные строки. Например, strings lib*jni.so | grep 'L[^;]*;' перечисляет все классы, на которые ссылается ссылка .so (например, Lcom/somecompany/project/SomeClass;). Вероятно, будет сложно совместить методы с классами, но в зависимости от ваших потребностей этого может быть достаточно.

  3. Создайте версию VM Dalvik, которая печатает сообщение logcat каждый раз, когда зарегистрирован собственный метод. Это самый передовой и трудоемкий, но самый точный. Просто следуйте инструкциям на http://source.android.com/source/index.html построить Android эмулятор, но, прежде чем строить, включить отладочную печать в конце dvmRegisterJNIMethod в dalvik/vm/Jni.cpp так он становится: LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);

1

Run javap на файл .class с собственными методами.

Смежные вопросы