我在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
为什么这两个符号表条目之间存在这种差异?函数名称周围_Z60
和P7JNIEnv_P8_jobject
的目的是什么?
我还注意到,在第一种情况下,我无法从Android java代码中调用JNI函数(它表示不满意 - 链接器错误,未找到实现)。
答案 0 :(得分:0)
C ++允许像Java那样的函数重载和命名空间。因此,它使用参数信息注释函数名称,以便链接器可以绑定到正确的重载。
JNI是为C设计的,它不允许函数重载或命名空间。因此它发明了它自己的注释系统,并提供了javah工具来帮助您使用它。标题也可以在C ++中使用。 C ++被设计为允许调用某些函数,就好像它们用C语言编写一样。标题包含指示编译器的代码。所以,把它们放在一起,你就可以用C ++编写Java可调用函数。