在 JNI 共享库中查找函数

Find the functions in a JNI Shared Library?

本文关键字:查找 函数 JNI 共享      更新时间:2023-10-16

有谁知道如何通过 NDK 编译的共享库显示所有可用的函数,其中包含面向公众的 JNI 函数/方法?

我有一个 lib*jni.so 文件,我需要它来访问它的方法。使用 nm -Dg lib*jni.so 输出共享库中的所有符号。我只在寻找定义为 JNI 钩子的钩子。

谢谢凯文

您可以使用一些技巧来找出这一点。

  1. 检查相应的.class文件。如果您有库的.class文件,则可以在 Eclipse 中打开它们并搜索 native 关键字以查看已声明为在本机中实现的方法。

  2. 使用 strings 命令转储所有字符串。除非库对 Java 方法名称等进行运行时连接(不太可能),否则您应该能够列出从 .so 引用的大多数 Java 方法和类,并带有 strings 。使用正则表达式,您可以过滤掉感兴趣的字符串。例如,将strings lib*jni.so | grep 'L[^;]*;'列出从 .so 引用的所有类(例如 Lcom/somecompany/project/SomeClass; )。将方法与类匹配可能会很棘手,但根据您的需要,这可能就足够了。

  3. 构建一个 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