java - JNA causes UnsatisfiedLinkException with Unix Stat -
so, i'm attempting call linux c - stat function.
my jna code:
public int stat(bap path, bap statdump); the bap class:
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"}); } } which, while nasty, performs byte array pointer many other functions successfully. think problem is, here: int stat(const char *restrict path, struct stat *restrict buf);, defined http://linux.die.net/man/3/stat
how pass constant char array, , *restrict mean? attempted google, don't think liked * in search query, nothing relevant.
edit: full exception
exception in thread "main" java.lang.reflect.invocationtargetexception @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java: 43) @ java.lang.reflect.method.invoke(method.java:497) @ org.eclipse.jdt.internal.jarinjarloader.jarrsrcloader.main(jarrsrcloader.java:58) caused by: java.lang.unsatisfiedlinkerror: error looking function 'stat': java: undefined symbol: stat @ com.sun.jna.function.<init>(function.java:208) @ com.sun.jna.nativelibrary.getfunction(nativelibrary.java:536) @ com.sun.jna.nativelibrary.getfunction(nativelibrary.java:513) @ com.sun.jna.nativelibrary.getfunction(nativelibrary.java:499) @ com.sun.jna.library$handler.invoke(library.java:199) @ com.sun.proxy.$proxy0.stat(unknown source)
have looked @ sys/stat.h see if there's actual declaration stat() or if it's c preprocessor macro?
in link above, stat stat64 if __use_file_offset64 defined.
to see if problem, change function name stat stat64.
as more permanent solution supply function mapper library load.
the following example first looks base label, tries again after appending "64":
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 base label } } return name; } }; map options = new hashmap() { { put(library.option_function_mapper, mapper); } }; library = native.loadlibrary("c", options);
Comments
Post a Comment