有谁知道如何通过 NDK 编译的共享库显示所有可用的函数,其中包含面向公众的 JNI 函数/方法?
我有一个 lib*jni.so 文件,我需要它来访问它的方法。使用 nm -Dg lib*jni.so 输出共享库中的所有符号。我只在寻找定义为 JNI 钩子的钩子。
谢谢凯文
您可以使用一些技巧来找出这一点。
-
检查相应的.class文件。如果您有库的.class文件,则可以在 Eclipse 中打开它们并搜索
native
关键字以查看已声明为在本机中实现的方法。 -
使用
strings
命令转储所有字符串。除非库对 Java 方法名称等进行运行时连接(不太可能),否则您应该能够列出从 .so 引用的大多数 Java 方法和类,并带有strings
。使用正则表达式,您可以过滤掉感兴趣的字符串。例如,将strings lib*jni.so | grep 'L[^;]*;'
列出从 .so 引用的所有类(例如Lcom/somecompany/project/SomeClass;
)。将方法与类匹配可能会很棘手,但根据您的需要,这可能就足够了。 -
构建一个 Dalvik VM 版本,该版本在每次注册本机方法时打印 logcat 消息。这是最先进和最耗时但最准确的。只需按照 http://source.android.com/source/index.html 中的说明构建 Android 模拟器,但在构建之前,请在 dalvik/vm/Jni 中
dvmRegisterJNIMethod
结束时启用调试打印.cpp因此它变为:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);
使用本机方法在.class文件上运行javap
。