如何查看通过System.loadLibrary加载的.so库的可用方法与类?
查看Android .so库导出方法/类的实用方式
用nm命令(Linux/macOS环境)
直接在终端运行nm -D 你的库文件名.so,输出里的符号中,T开头的是导出的全局函数,这通常就是你能通过JNI调用的方法。如果是C++编写的库,符号会被名字修饰(比如变成_Zxxxx这种形式),可以用c++filt工具解析:nm -D 你的库文件名.so | c++filt,就能看到还原后的函数名和类方法。用Android NDK的readelf工具
如果你装了NDK,找到readelf工具路径(一般在NDK的toolchains/llvm/prebuilt/对应平台/bin下),运行readelf -s 你的库文件名.so,输出的符号表会包含更详细的信息,比如符号类型、大小、所属段,同样关注标记为FUNC且绑定为GLOBAL的条目,这些就是可调用的导出函数。反编译工具(IDA Pro/Ghidra)
这类可视化反编译工具能直接打开.so文件,自动解析符号表、类结构和函数逻辑。你可以看到完整的导出函数列表,甚至能查看函数的伪代码,适合分析复杂的库。如果是JNI相关的类方法,还能定位到对应的JNI注册逻辑。动态调试(Android Studio + LLDB)
在App加载.so后,用Android Studio attach到进程,打开LLDB控制台:- 输入
image list可以查看当前加载的所有库; - 输入
image lookup -n 函数名可以搜索特定导出符号; - 也可以用
image dump symtab 你的库文件名.so直接输出该库的所有符号表。
- 输入
注意:.so里的普通C++类如果没有被导出(未用
extern "C"或未声明为全局可见),是无法直接看到的,只有JNI暴露的方法和全局导出的类/函数才会出现在符号表里。
内容的提问来源于stack exchange,提问作者Markusbug
相关产品推荐
相关产品推荐

