我尝试调用Linux的C-stat函数.
我的JNA代码:
public int stat(bap path, bap statdump);
BAP类:
public static class bap extends Structure {
public byte[] array;
public bap(int size) {
array = new byte[size];
}
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{"array"});
}
}
虽然很麻烦,但它可以成功地作为许多其他函数的字节数组指针。我认为问题在于:int stat(const char *restrict path, struct stat *restrict buf);
,由http://linux.die.net/man/3/stat定义
我如何传递一个常量字符数组,* restricted是什么意思?我试着用google搜索,但我不认为它喜欢搜索查询中的 *,因为没有相关的内容。
EDIT:完整异常
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.UnsatisfiedLinkError: Error looking up function 'stat': java: undefined symbol: stat
at com.sun.jna.Function.<init>(Function.java:208)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:536)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:513)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:499)
at com.sun.jna.Library$Handler.invoke(Library.java:199)
at com.sun.proxy.$Proxy0.stat(Unknown Source)
2条答案
按热度按时间8iwquhpp1#
您是否查看过
sys/stat.h
,以确定是否存在stat()
的实际声明,或者它是否是一个C预处理器宏?在上面的链接中,如果定义了
__USE_FILE_OFFSET64
,则stat
实际上就是stat64
。要查看这是否是您的问题,只需将函数名从
stat
更改为stat64
。作为一个更持久的解决方案,请为库加载提供function mapper。
下面的示例首先查找基本标签,然后在追加“64”后重试:
y53ybaqx2#
也有可能
stat
函数在您安装的libc版本上不存在,就像我遇到的那样。stat
函数在使用GLIBC 2.31
的Debian 11.6上不存在,但在使用GLIBC 2.35
的Ubuntu 22.04上存在。但是
libc stat
函数只是syscall
4
的 Package 器,因此您可以使用以下代码通过syscall
函数调用stat
如果您感兴趣,完整代码为hosted here
Debian 11.6版本
Ubuntu 22.02