嗨:我想使用 JNA 访问本机库中的一些功能。
1)我如何内省本机库文件(例如.so文件)以查看可用的方法?
2) .so 文件中可访问的方法与为编译这些文件而构建的 C 代码之间是否存在一对一的映射?
3) JNA 是否保证在唯一的 java/native 互操作涉及从 Java 调用本地库的所有情况下工作(我认为这是 JNA 的经典用例)——或者有时需要 JNI?
嗨:我想使用 JNA 访问本机库中的一些功能。
1)我如何内省本机库文件(例如.so文件)以查看可用的方法?
2) .so 文件中可访问的方法与为编译这些文件而构建的 C 代码之间是否存在一对一的映射?
3) JNA 是否保证在唯一的 java/native 互操作涉及从 Java 调用本地库的所有情况下工作(我认为这是 JNA 的经典用例)——或者有时需要 JNI?
1) Windows 上的depends.exeobjdump
, , nm
, 等。在 *nix 变体上。
2) 大多数共享库都是为 C 风格的链接而设计的。这通常意味着您可以在库中查找与符号对应的地址,但类型(变量、常量或函数)和签名信息(对于函数)通常不嵌入库中。
3) JNA 使用很少的通用 JNI 操作来执行它所有的魔法:打开共享库、查找符号、读/写内存、调用函数。在极少数情况下,您必须在 JNA 上使用 JNI,至少在处理具有 C 链接的库时。