2

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

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

谢谢,凯文

4

2 回答 2

4

您可以使用一些技巧来找出答案。

  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.htmldvmRegisterJNIMethod上的说明构建 Android 模拟器,但在构建之前,请在dalvik/vm/Jni.cpp的末尾启用调试打印,使其变为:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);

于 2012-06-05T07:37:12.990 回答
1

javap使用本机方法在 .class 文件上运行。

于 2012-06-05T07:37:02.560 回答