【问题标题】:nm: shared library symbol appearing twice or oncenm:共享库符号出现两次或一次
【发布时间】:2017-02-01 14:55:28
【问题描述】:

我有一个共享库 (libARWrapper.so),其中包括以下两个条目,使用 nm (nm -D --defined-only libARWrapper.so) 显示

00075854 T Java_org_artoolkit_ar_base_NativeInterface_arwAcceptVideoImage
00074d54 T Java_org_artoolkit_ar_base_NativeInterface_arwCapture
...
00072d54 T arwCapture

我知道T means“符号在文本(代码)部分。”

arwCapture 出现两次和 arwAcceptVideoImage 只出现一次有什么区别。

我可以从 C# DllImport 调用 arwCapture,但不能调用 arwAcceptVideoImage
还有很多其他功能和arwCapture一样,都在org.artoolkit.ar.bash.NativeInterface下,我可以用OK。
其他 (Java) 代码可以通过 NDK 调用所有函数。

【问题讨论】:

  • 文本段中存储了一些东西并不意味着它是一个函数或一些代码。编译时常量通常也会出现在文本段中,例如字符串文字。
  • 我在这里没有看到任何符号出现两次。 Java_org_artoolkit_ar_base_NativeInterface_arwCapturearwCapture 是两个截然不同的符号。输出没有提到任何arwAcceptVideoImage 符号,所以很自然你不能调用它,
  • 谢谢,所以区别是出现两次的定义为函数和JNI调用,但出现一次的只定义为JNI调用。现在有道理了,谢谢!

标签: c# c shared-libraries artoolkit nm


【解决方案1】:

nm 发布的输出中,没有证据表明您所说的内容(arwCapture() 没有出现两次)。一个是 JNI 函数,它肯定是一个在某些时候调用 arwCapture() 的包装器。

大概arwCapture() 是一个c 函数,这就是为什么您可以从C# 调用它的原因,但是在共享对象中,尽管定义了Java 的arwAcceptVideoImage() 方法,但在任何地方都没有arwAcceptVideoImage()

如果此共享对象旨在作为 JNI 对象,则应避免从 Java 以外的其他语言调用它。而是找到原始库并使用它。

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多