在共享库中调用函数但不在头文件中声明

时间:2017-12-06 13:32:10

标签: c android-ndk java-native-interface shared-libraries header-files

我正在做一些关于通过Java向JNI调用共享库函数的实现。 JNI由C代码实现。 这是我的问题。 共享库中有一个名为ABC()的函数。 此函数不在头文件中声明。 但是使用NDK构建,它可以成功,此功能也可以正常工作。

这非常令人困惑。 为什么?为什么它可以由NDK构建,为什么可以毫无例外地调用它? 感谢您的回答:)

1 个答案:

答案 0 :(得分:2)

这里有两种可能性。

  1. 使用该函数的文件可能包含自己的函数声明。 (声明不要求只在头文件中。)

  2. 如果使用函数而不声明它,编译器可能会提供默认声明。这不是现代C的一部分,但编译器可能会使用旧标准或在这方面过于宽松。默认声明是int SomeName()类型的函数。这种隐式声明自动具有外部链接,这意味着当链接库时,名称将与函数的定义匹配。

  3. 如果是后者,建议您启用其他开关,以告知编译器发出更多警告消息并使用现代语言标准(例如C 2011),至少在开发新代码时。 / p>

    使用共享库中但未在其标头中声明的例程是不可取的。这样的例程通常仅用于库的内部使用,并且它们可能在库的未来版本中改变或消失。所以使用它们的代码会破坏;它与新版本的库不兼容。