nm 未列出 android 原生代码中的静态方法

nm not list static method from android native code

提问人:lucky1928 提问时间:10/21/2022 最后编辑:lucky1928 更新时间:10/21/2022 访问量:49

问:

我有以下android本机代码:

#include <jni.h>
#include <string>
#include <android/log.h>

#define TAG "MyExam"
#define LOGD(msg) __android_log_print(ANDROID_LOG_DEBUG,TAG,msg);

int testOne() {
    LOGD("one");
    return 1;
}

static int testTwo() {
    LOGD("TWO");
    return 2;
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_sample_jniexam_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    LOGD("JNI");
    testOne();
    testTwo();
    return env->NewStringUTF(hello.c_str());
}

但是当尝试运行 nm 列出符号时,找不到静态方法 testTwo()!

nm -gD --demangle ./app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjniexam.so |grep test
000081ed T testOne()

我应该使用哪个工具来列出静态方法符号?

更新

感谢@dimich的评论,在检查调试符号文件后,我发现了以下结果:

$ nm ./app/build/intermediates/cmake/debug/obj/armeabi-v7a/libjniexam.so |grep test
000081ed T _Z7testOnev
000082e1 t _ZL7testTwov

此输出中的“T”和“t”是什么意思?

安卓 Linux NM

评论

0赞 dimich 10/21/2022
静态函数在当前编译单元之外不可见,因此不会导出符号。这是 C 中函数关键字的目的。您可以尝试使用调试信息进行编译,并从目标文件中提取调试符号。static
0赞 lucky1928 10/21/2022
@dimich 谢谢,是的,调试符号有它,但仍然没有弄清楚 nm 输出中的“T”和“t”是什么意思。
0赞 dimich 10/22/2022
实际上,静态函数存在于带有“t”(本地文本符号)的目标文件中,但如果未使用或内联,优化可以将其删除。如果设置为静态函数,它将显示为“t”。__attribute__((noinline))

答: 暂无答案