带变量的Java加载库

带变量的Java加载库,java,shared-libraries,Java,Shared Libraries,我正在尝试使用System.load()函数和一个变量加载库。 当我在每个函数中加载库时,它都会工作,但我希望能够使用一个通用系统加载来完成,类似于使用已知库路径加载时所做的操作 static{ System.load("/libraryPath/libLibrary.so"); } 但是,无法为此System.load提供静态变量,因为在调用load时它不会被实例化。 有什么想法吗? 多谢各位 编辑 我找到了解决办法, 我最终在另一个类中使用了静态get

我正在尝试使用System.load()函数和一个变量加载库。 当我在每个函数中加载库时,它都会工作,但我希望能够使用一个通用系统加载来完成,类似于使用已知库路径加载时所做的操作

    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();
            }
        }
    }
}