我有一个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");
}
}
Run Code Online (Sandbox Code Playgroud)
"mylib.so"位于Main.class所在的目录中.
当我跑步时,java Main我得到以下异常:
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.<clinit>(Main.java:24)
Run Code Online (Sandbox Code Playgroud)
我应该为此改变什么呢?
我试过设置库完整路径但没有成功
请执行下列操作:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中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;
}
Run Code Online (Sandbox Code Playgroud)
!但首先你必须复制你的本土lib :)
然后在执行任何类构造函数之前,在"最多根"类中的静态块中加载本机库调用"addLibsToJavaLibraryPath"方法.
static {
NativeLibsLoaderUtil.addLibsToJavaLibraryPath("/tmp");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30651 次 |
| 最近记录: |