理解符号表条目(当标题函数不存在时)

时间:2017-05-05 05:43:45

标签: android c++ gcc linker java-native-interface

我在C ++库中有一个JNI函数。

当我在头文件中使用cmake(但忘记放置函数声明)创建库时,库已成功创建。

当我在库符号表中查找函数名时,我得到以下输出

nm libuserlibrary.so | grep printxx
00506e60 T _Z60Java_com_example_user_myapplication_userlibrary_printxxP7JNIEnv_P8_jobject

但是当我在头文件中给出函数声明时,我得到以下输出

nm libuserlibrary.so | grep printxx
00506e50 T Java_com_example_user_myapplication_userlibrary_printxx 

为什么这两个符号表条目之间存在这种差异?函数名称周围_Z60P7JNIEnv_P8_jobject的目的是什么?

我还注意到,在第一种情况下,我无法从Android java代码中调用JNI函数(它表示不满意 - 链接器错误,未找到实现)。

1 个答案:

答案 0 :(得分:0)

C ++允许像Java那样的函数重载和命名空间。因此,它使用参数信息注释函数名称,以便链接器可以绑定到正确的重载。

JNI是为C设计的,它不允许函数重载或命名空间。因此它发明了它自己的注释系统,并提供了javah工具来帮助您使用它。标题也可以在C ++中使用。 C ++被设计为允许调用某些函数,就好像它们用C语言编写一样。标题包含指示编译器的代码。所以,把它们放在一起,你就可以用C ++编写Java可调用函数。