奇怪的问题不是很确定该怎么问。
我正在为专有共享库编写一些JNA绑定。
库api具有几个名为km_open,km_close等的函数。 在c中,这些函数在头文件中的定义如下:
Komodo km_open (
int port_number
);
int km_close (
Komodo komodo
);
在Java中,我为它们定义了JNA绑定,如下所示:
public abstract Komodo km_open(int port_number);
public abstract int km_close(Komodo komodo);
但是JNA无法在库中找到这些符号。 当我将符号转储到二进制文件中时 我发现以下内容:
0000000000008e20 g DF .text 0000000000000005 Base net_km_open
0000000000007410 g DF .text 0000000000000005 Base c_km_open
0000000000008e40 g DF .text 0000000000000005 Base net_km_close
0000000000007430 g DF .text 0000000000000005 Base c_km_close
我猜测是因为.net和独立的c应用程序都打算使用该库,所以这些名称都经过修饰以提供该功能的替代版本。但是我在演示应用程序源代码中找不到任何将名称c_km_open映射到km_open的东西。但它可以在GCC中编译,并且代码可以正常工作。链接/加载二进制文件时,这些符号如何解析?JNA是否具有执行相同操作的方法?当前,如果我像这样修改绑定,则可以使JNA绑定起作用:
public abstract Komodo c_km_open(int port_number);
public abstract int c_km_close(Komodo komodo);
这是一个可以接受的解决方法,我只想了解这里的背景情况。
答案 0 :(得分:0)
没关系,我找到了答案,这有点棘手,但是makefile并没有链接.so库文件本身,而是生成了一个与.so库同名的目标代码,该对象代码定义了包装方法,动态加载“ c_”函数。然后,它们链接到那段目标代码而不是库。它没有在搜索中出现,因为它是生成的文件。 然后,JNA的解决方案是通过使用简化名称创建包装类来模拟该行为,该包装类将回调JNA绑定