有没有人知道如何通过NDK编译的共享库展示所有可用的公共面向JNI函数/方法的函数?
我有一个lib * jni.so文件,我需要访问它的方法。使用nm -Dg lib * jni.so输出共享库中找到的所有符号。我只是在寻找定义为JNI钩子的那些。
谢谢, 凯文
答案 0 :(得分:4)
你可以用一些技巧来解决这个问题。
检查相应的.class文件。如果您有库的.class文件,可以在Eclipse中打开它们并搜索native
关键字以查看哪些方法已声明以原生方式实现。
使用strings
命令转储所有字符串。除非库执行Java方法名称等的运行时连接(不太可能),否则您应该能够列出大多数Java方法和使用strings
从.so引用的类。使用regexp,您可以过滤掉有趣的字符串。例如,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.cpp中的dvmRegisterJNIMethod
末尾启用调试打印,使其变为:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);
< / p>
答案 1 :(得分:1)
使用本机方法在.class文件上运行javap
。