带变量的Java加载库
我正在尝试使用System.load()函数和一个变量加载库。 当我在每个函数中加载库时,它都会工作,但我希望能够使用一个通用系统加载来完成,类似于使用已知库路径加载时所做的操作带变量的Java加载库,java,shared-libraries,Java,Shared Libraries,我正在尝试使用System.load()函数和一个变量加载库。 当我在每个函数中加载库时,它都会工作,但我希望能够使用一个通用系统加载来完成,类似于使用已知库路径加载时所做的操作 static{ System.load("/libraryPath/libLibrary.so"); } 但是,无法为此System.load提供静态变量,因为在调用load时它不会被实例化。 有什么想法吗? 多谢各位 编辑 我找到了解决办法, 我最终在另一个类中使用了静态get
static{
System.load("/libraryPath/libLibrary.so");
}
但是,无法为此System.load提供静态变量,因为在调用load时它不会被实例化。
有什么想法吗?
多谢各位
编辑
我找到了解决办法,
我最终在另一个类中使用了静态getter。
这样做的好处是,我可以解析存储位置的配置文件。存储变量,并在我需要库的类中使用静态方法检索它。现在我可以做这样的一般加载:
static{
System.load(OtherClass.getLibrary());
}
感谢所有帮助静态代码按声明顺序执行,因此您需要在静态代码块之前声明变量。这就是为什么静态代码块经常出现问题,最好用不同的形式来替换。如果我理解得很好,您希望确保
System.load("/libraryPath/libLibrary.so");
在代码的不同部分使用它之前已经完成
如果您创建了一个类来执行以下操作,那么您应该得到它
public class Loader {
static {
System.load("/libraryPath/libLibrary.so");
}
public static void init() {
}
}
在使用库之前的代码中:
Loader.init();
// Code using native library
这将确保该库只加载一次,但您也可以确保在使用它之前已加载该库
方法
init()
是确保类加载器有效加载到内存中的技巧。只有import
语句不足以确保执行static
init。以下是我在任何地方加载本机代码的代码。
我希望它能帮助你
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class NativeLoader {
/** Directory containing native libraries */
private static final String NATIVE_LIBS_DIRECTORY = "/native/";
/** Extension for temporary file containing extracted native library */
private static final String TEMPORARY_FILE_EXT = ".tmp";
/**
* Loads a native library
*
* @param libraryName
* name of the native library to load
* @throws IOException
* if the native library cannot be loaded
*/
public static void loadEmbeddedLibrary(String libraryName) throws IOException {
String mapName = System.mapLibraryName(libraryName);
InputStream is = NativeLoader.class.getResourceAsStream(NATIVE_LIBS_DIRECTORY + mapName);
if (is != null) {
File native_library = File.createTempFile(mapName, TEMPORARY_FILE_EXT);
native_library.deleteOnExit();
native_library.setWritable(true);
native_library.setExecutable(true);
if (native_library.exists()) {
FileOutputStream os = new FileOutputStream(native_library);
int read;
byte[] buffer = new byte[4096];
while ((read = is.read(buffer)) != -1) {
os.write(buffer, 0, read);
}
os.close();
is.close();
System.load(native_library.getPath());
}
else {
is.close();
}
}
}
}