如何在java中加载和使用本机库?

我有一个java类,调用本机方法并尝试加载库:

import java.io.UnsupportedEncodingException; public class Main { public static native String getMyString(String s); /** * @param args * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { // TODO Auto-generated method stub // System.out.println("here!"); String s2 = getMyString("string text"); for (Byte b : s2.getBytes("UTF-8")) { System.out.print(b); System.out.print(","); } } static { System.loadLibrary("mylib.so"); } } 

“mylib.so”位于Main.class所在的目录中。

当我运行java Main我得到以下exception:

 Exception in thread "main" java.lang.UnsatisfiedLinkError: no mylib.so in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856) at java.lang.Runtime.loadLibrary0(Runtime.java:845) at java.lang.System.loadLibrary(System.java:1084) at Main.(Main.java:24) 

我应该为此改变什么呢?

我试过设置库完整路径但没有成功

请执行下列操作:

  • 使用System.loadLibrary(“mylib”);
  • 将mylib.so复制到libmylib.so
  • 运行java -Djava.library.path = / root / Main

“如何加载本机库”

 public final class NativeLibsLoaderUtil { private static final String JAVA_LIBRARY_PATH = "java.library.path"; private static final String SYS_PATHS = "sys_paths"; private NativeLibsLoaderUtil() { } private static void addLibsToJavaLibraryPath(final String tmpDirName) { try { System.setProperty(JAVA_LIBRARY_PATH, tmpDirName); /* Optionally add these two lines */ System.setProperty("jna.library.path", tmpDirName); System.setProperty("jni.library.path", tmpDirName); final Field fieldSysPath = ClassLoader.class.getDeclaredField(SYS_PATHS); fieldSysPath.setAccessible(true); fieldSysPath.set(null, null); } catch (IllegalAccessException | NoSuchFieldException e) { LOGGER.error(e.getMessage(), e); } } } 

其中tmpDirName是存储库的目录。 或者您可以修改上面的类并使用系统属性中的临时目录,如下所示:

 /** * Temporary directory system property name */ private static final String JAVA_IO_TMPDIR = "java.io.tmpdir"; /** * * @return */ private static File getTempDir() { final String tmpDirName = System.getProperty(JAVA_IO_TMPDIR); final File tmpDir = new File(tmpDirName); if (!tmpDir.exists()) { tmpDir.mkdir(); } return tmpDir; } 

!但首先你必须复制你的本土lib 🙂

然后在执行任何类构造函数之前,在“最多根”类中的静态块中加载本机库调用“addLibsToJavaLibraryPath”方法。

 static { NativeLibsLoaderUtil.addLibsToJavaLibraryPath("/tmp"); } 

您应该将so添加到库路径: -Djava.libarary.path = (这是在java命令中)。

如果从eclipse运行: 如何在Eclipse启动时将本机库添加到“java.library.path”(而不是覆盖它)

正如Reimeus回答的那样。 或者您可以使用System.load(“/ Library / Path / libsample.so”);