有谁知道如何显示所有通过NDK编译的共享库可用的公共面向JNI函数/方法的功能?在JNI共享库中查找函数?
我有一个lib * jni.so文件,我需要访问它的方法。使用nm -Dg lib * jni.so输出共享库中找到的所有符号。我只是在寻找那些被定义为JNI钩子的人。
感谢,在与本地方法的.class文件 凯文
有谁知道如何显示所有通过NDK编译的共享库可用的公共面向JNI函数/方法的功能?在JNI共享库中查找函数?
我有一个lib * jni.so文件,我需要访问它的方法。使用nm -Dg lib * jni.so输出共享库中找到的所有符号。我只是在寻找那些被定义为JNI钩子的人。
感谢,在与本地方法的.class文件 凯文
有几个技巧可以用来找出答案。
检查相应的.class文件。如果您有该库的.class文件,则可以在Eclipse中打开它们并搜索关键字native
以查看哪些方法已声明为在本机中实现。
使用strings
命令转储所有字符串。除非库执行Java方法名的运行时连接等(不太可能),否则应该能够列出大多数从.so引用的Java方法和类,其中strings
。使用正则表达式,可以过滤出有趣的字符串。例如,strings lib*jni.so | grep 'L[^;]*;'
将列出从.so引用的所有类(例如Lcom/somecompany/project/SomeClass;
)。将方法与类匹配可能会很棘手,但根据您的需要,这可能就足够了。
构建Dalvik虚拟机的一个版本,每登录一次本地方法就打印一条logcat消息。这是最先进,最耗时,但最准确的。只需按照指示在http://source.android.com/source/index.html建立一个Android模拟器,但是你建立之前,在dvmRegisterJNIMethod
年底dalvik/vm/Jni.cpp所以它成为启用调试打印:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);
运行javap
。