在JNI共享库中查找函数?

时间:2012-06-04 21:23:28

标签: android c++ java-native-interface

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

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

谢谢, 凯文

2 个答案:

答案 0 :(得分:4)

你可以用一些技巧来解决这个问题。

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

  2. 使用strings命令转储所有字符串。除非库执行Java方法名称等的运行时连接(不太可能),否则您应该能够列出大多数Java方法和使用strings从.so引用的类。使用regexp,您可以过滤掉有趣的字符串。例如,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.cpp中的dvmRegisterJNIMethod末尾启用调试打印,使其变为:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature); < / p>

答案 1 :(得分:1)

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