將 Jar 檔中的 Resource 複製到 library path 中,好讓不同位元的機器能夠載入正確的 Library。
以下為 Java 片段程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
try { String libpath = System.getProperty("java.library.path"); if (libpath == null || libpath.length() == 0) { throw new RuntimeException("not have java.library.path"); } String path = null; StringTokenizer st = new StringTokenizer(libpath, System.getProperty("path.separator")); if (st.hasMoreElements()) { path = st.nextToken(); } else { throw new RuntimeException("can not split library path:" + libpath); } // detect cpu arch String arch = System.getProperty("sun.arch.data.model"); InputStream inputStream; if(arch.equals("32")){ inputStream = Auth.class.getResource("lib32.so").openStream(); }else{ inputStream = Auth.class.getResource("lib64.so").openStream(); } final File dllFile = new File(new File(path), "lib.so"); if(!dllFile.exists()){ libFile = dllFile.getAbsolutePath(); if (!dllFile.exists()) { FileOutputStream outputStream = new FileOutputStream(dllFile); byte[] array = new byte[8192]; for (int i = inputStream.read(array); i != -1; i = inputStream.read(array)) { outputStream.write(array, 0, i); } outputStream.close(); } } } catch (Throwable e) { throw new RuntimeException("load libjpam.so error!", e); } |