'Can't obtain static method fromNative(Method, Object) from class com.sun.jna.Native

I'm using the JNA's com.sun.jna.NativeLibrary class in order to load the VLCJ native library. I'm working on an armv8(aarch x64)-based linux device. Below is my code, note that i am using the latest JNA version jna-4.5.2:

NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), Constants.DEPLIB_OUTPUT_DIRECTORY);
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
LibXUtil.initialise();

First i was getting this error:

java.lang.UnsatisfiedLinkError: JNA native support (com/sun/jna/linux-aarch64/libjnidispatch.so) not found in resource path

After a quick search i found that i must copy the jna native lib directory from inside the jar into the jvm lib path, where the jna jar library has pre-built libraries for almost all known systems as shown in the image below:

jna-4.5.2 internal content.jpeg

After doing that, the above exception disappeared but another one came up:

java.lang.UnsatisfiedLinkError: Can't obtain static method fromNative(Method, Object) from class com.sun.jna.Native

the exception is saying that it couldn't find the method fromNative(Method, Object) in the class com.sun.jna.Native however after decompiling this class i found that the method already exists.

I'm out of ideas know, any help would be highly appreiated, thanks!.



Solution 1:[1]

solve by:

  1. undo this step:

After a quick search i found that i must copy the jna native lib directory from inside the jar into the jvm lib path...

  1. remove all jna modules (jars) from my project
  2. download and link the following jars into my project: jna.jar jna-platform.jar linux-aarch64.jar

Solution 2:[2]

If the jar files: jna-5.11.0.jar and jna-platform-5.11.0.jar (or whatever version number you are using) if in you lib path (build path in Eclipse), the java command option:

-Djna.nosys=true

may solve the problem. When first started, JNA is loads its own native access library and it wasn't finding it. jna.nosys=true allows JNA to look in the jna-X.XX.X.jar file for what it needs. The error message confused my because JNA seemed to be found and loaded, but it was complaining about not finding 'fromNative'.

From JNA documentation:

Loading JNA

JNA includes a small, platform-specific shared library which enables all
native access. When the Native class is first accessed, JNA will first
attempt to load this library from the directories specified in
jna.boot.library.path. If that fails and jna.nosys=false is set, it will
fall back to loading from the system library paths. Finally it will attempt
to extract the stub library from from the JNA jar file, and load it.

The jna.boot.library.path property is mainly to support jna.jar being
included in -Xbootclasspath, where java.library.path and LD_LIBRARY_PATH are
ignored. It is also useful for designating a version of the library to use
in preference to any which may already be installed on the system.
...

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 peter bence
Solution 2 Ribo