有谁知道如何通过 NDK 编译的共享库和面向公众的 JNI 函数/方法显示所有可用的函数?
我有一个 lib* jni.so 文件,我需要访问它的方法。使用 nm -Dg lib *jni.so 输出共享库中的所有符号。我只是在寻找定义为 JNI 钩子的那些。
谢谢,凯文
有谁知道如何通过 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.htmldvmRegisterJNIMethod
上的说明构建 Android 模拟器,但在构建之前,请在dalvik/vm/Jni.cpp的末尾启用调试打印,使其变为:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);
javap
使用本机方法在 .class 文件上运行。