美文网首页
Java调用jar包里的so或dll文件

Java调用jar包里的so或dll文件

作者: 清蒸三文鱼_ | 来源:发表于2024-06-02 12:04 被阅读0次

背景

有一个集中放so和dll文件的一个maven项目, 通过pom.xml进行引入到一个spring boot的项目中, 调用方法时报错URI is not hierarchical, 但是再so所在的项目执行时没有报错的, 那么解决的思路就是把jar包解压出来, 放到临时目录后再调用native加载

代码

public static <T> T load(Class<T> clazz, String relativePath) throws URISyntaxException, IOException {
        //相对路径,如项目中resources/下的文件
        URL url = Native.class.getClassLoader().getResource(relativePath);
        URI uri = url.toURI();
        String absPath = null;
        //通过jar解压到临时目录后,再进行加载
        if (uri.isOpaque()) {
            File copyFile = copyFileFromJar(url, relativePath);
            absPath = copyFile.getAbsolutePath();

        } else {
            absPath = new File(uri).getAbsolutePath();
        }
        return Native.loadLibrary(absPath, clazz);
    }


    private static File copyFileFromJar(URL url, String filePath) throws IOException {
        JarURLConnection urlConnection = (JarURLConnection) url.openConnection();
        JarFile jarFile = urlConnection.getJarFile();
        InputStream is = jarFile.getInputStream(jarFile.getJarEntry(filePath));
        String tempDirPath = System.getProperty("java.io.tmpdir");
        File copyFile = new File(tempDirPath + File.separator + "snc_pre_process" + File.separator + filePath);
        if (copyFile.exists()) {
            copyFile.delete();
        }
        File parent = new File(copyFile.getParent());
        if (!parent.exists()) {
            parent.mkdirs();
        }
        FileOutputStream fos = new FileOutputStream(copyFile);
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = is.read(buffer)) != -1) {
            fos.write(buffer, 0, bytesRead);
        }
        fos.close();
        is.close();
        jarFile.close();
        return copyFile;
    }

相关文章

网友评论

      本文标题:Java调用jar包里的so或dll文件

      本文链接:https://www.haomeiwen.com/subject/gevmfjtx.html