JNA在Unix Stat中导致UnsatisfiedLinkException

时间:2015-04-25 03:10:36

标签: java c linux java-native-interface jna

所以,我试图调用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

定义

如何传递常量char数组,* restrict的含义是什么?我试图谷歌,但我认为它不喜欢*在搜索查询中,因为没有任何相关性。

编辑:完全例外

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)

1 个答案:

答案 0 :(得分:1)

您是否查看过sys/stat.h,看看是否有stat()的实际声明,或者它是否是C预处理器宏?

在上面的链接中,如果定义statstat64实际上将是__USE_FILE_OFFSET64

要查看这是否是您的问题,只需将功能名称从stat更改为stat64

作为一种更永久的解决方案,为您的图书馆加载提供function mapper

以下示例首先查找基本标签,然后在追加&#34; 64&#34;后再次尝试:

FunctionMapper mapper = new FunctionMapper() {
    public String getFunctionName(NativeLibrary library, java.lang.reflect.Method method) {
        String name = method.getName();
        try {
            library.getFunction(name);
        } catch(UnsatisfiedLinkError e) {
            try {
                library.getFunction(name + "64");
                return name + "64";
            } catch(UnsatisfiedLinkError e) {
                 // If neither variant worked, report failure on the base label
            }
        }
        return name;
    }
};
Map options = new HashMap() {
    { put(Library.OPTION_FUNCTION_MAPPER, mapper); }
};
library = Native.loadLibrary("c", options);