16人参与 • 2026-01-21 • Android
在android开发或linux系统编程中,动态链接库(.so文件)承载着核心的本地代码实现。特别是使用jni(java native interface)技术时,我们经常需要确认:
本文将以实战角度,介绍多种查看.so文件中方法的工具和技巧。
# 查看动态符号表(推荐) objdump -t libnative.so # 反汇编查看代码逻辑 objdump -d libnative.so # 组合使用:快速定位jni方法 objdump -t libnative.so | grep "java_"
特点:
# 查看动态符号 nm -d libnative.so # 显示所有符号(包括未导出) nm libnative.so # 按类型过滤(t=代码段,u=未定义) nm -d libnative.so | grep " t "
特点:
# 详细符号表信息 readelf -ws libnative.so # 查看动态段信息 readelf -d libnative.so
特点:
场景:分析 libnative-lib.so 中的jni方法
# 使用任何工具配合grep过滤"java_"前缀 objdump -t libnative-lib.so | grep "java_" # 输出示例: # 000000000001234 g df .text 00068 base java_com_example_app_mainactivity_stringfromjni
# 按列格式化输出,便于阅读
readelf -ws libnative-lib.so | awk '/java_/ {printf "%-40s %-20s\n", $8, $4}'
#!/bin/bash
# analyze_jni.sh
lib=$1
echo "=== jni methods in $lib ==="
echo "tool | count | sample method"
echo "----------|-------|--------------"
# 使用objdump
count1=$(objdump -t "$lib" | grep -c "java_")
sample1=$(objdump -t "$lib" | grep "java_" | head -1 | awk '{print $nf}')
echo "objdump | $count1 | $sample1"
# 使用nm
count2=$(nm -d "$lib" | grep -c "java_")
sample2=$(nm -d "$lib" | grep "java_" | head -1 | awk '{print $3}')
echo "nm | $count2 | $sample2"
# 使用readelf
count3=$(readelf -ws "$lib" | grep -c "java_")
sample3=$(readelf -ws "$lib" | grep "java_" | head -1 | awk '{print $8}')
echo "readelf | $count3 | $sample3"
# 使用ndk提供的交叉编译版本(android专属) $ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-objdump -t libnative-lib.so
如果.so发布时被strip处理过:
# 尝试反汇编寻找jni模式 objdump -d stripped_lib.so | less # 搜索jnienv指针使用模式(如x0寄存器传递)
# 查看修饰后的符号 nm libnative.so | grep "_z" # 使用c++filt还原可读名称 nm libnative.so | c++filt | grep "java_"
# 批量检查当前目录所有.so文件的jni方法
for lib in *.so; do
echo "=== $lib ==="
nm -d "$lib" | grep "java_" | wc -l
done
java_包名_类名_方法名 ↓ java_com_example_app_mainactivity_oncreate │ │ │ │ 固定 包名 类名 方法名 (点替换为下划线)
如果库包含调试信息,可以查看详细签名:
# 使用objdump查看重定位信息 objdump -r libnative.so | grep java_
在java/kotlin端验证:
// 加载前检查
static {
try {
system.loadlibrary("native-lib");
log.d("jni", "library loaded successfully");
} catch (unsatisfiedlinkerror e) {
log.e("jni", "method not found: " + e.getmessage());
}
}
需要分析.so文件?
├── 只需快速查看jni方法 → `nm -d lib.so | grep "java_"`
├── 需要详细反汇编信息 → `objdump -d lib.so`
├── 分析elf结构细节 → `readelf -ws lib.so`
└── 处理android库 → 使用ndk交叉编译版objdump
掌握.so文件分析方法,能帮助开发者:
无论是日常开发还是性能优化,这些技能都是native开发者的必备利器。
到此这篇关于android查看.so文件中的jni方法详解的文章就介绍到这了,更多相关android查看.so文件jni方法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论