{"id":37016138,"url":"https://github.com/zhongwm/native-lib-preparer","last_synced_at":"2026-01-14T01:48:34.430Z","repository":{"id":57735451,"uuid":"273935744","full_name":"zhongwm/native-lib-preparer","owner":"zhongwm","description":"java native library preparer","archived":false,"fork":false,"pushed_at":"2021-03-28T01:08:24.000Z","size":39,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-23T12:59:55.658Z","etag":null,"topics":["java","java-dll","java-dylib","java-so","jna","native-library"],"latest_commit_sha":null,"homepage":"https://github.com/zhongwm/native-lib-preparer","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhongwm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-21T15:49:40.000Z","updated_at":"2022-10-26T15:02:26.000Z","dependencies_parsed_at":"2022-08-23T15:21:52.806Z","dependency_job_id":null,"html_url":"https://github.com/zhongwm/native-lib-preparer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zhongwm/native-lib-preparer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongwm%2Fnative-lib-preparer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongwm%2Fnative-lib-preparer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongwm%2Fnative-lib-preparer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongwm%2Fnative-lib-preparer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhongwm","download_url":"https://codeload.github.com/zhongwm/native-lib-preparer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhongwm%2Fnative-lib-preparer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408689,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T00:40:43.272Z","status":"ssl_error","status_checked_at":"2026-01-14T00:40:42.636Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","java-dll","java-dylib","java-so","jna","native-library"],"created_at":"2026-01-14T01:48:33.709Z","updated_at":"2026-01-14T01:48:34.420Z","avatar_url":"https://github.com/zhongwm.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# A Java Native Lib Preparer\n\nJava native library preparer, get native library prepared for JNA / JNI loading.\n\n#### Installation\n\nsbt\n\n```scala\nlibraryDependencies += \"io.github.zhongwm.commons\" % \"native-lib-preparer\" % \"0.2.1\"\n```\nMaven\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.zhongwm.commons\u003c/groupId\u003e\n    \u003cartifactId\u003enative-lib-preparer\u003c/artifactId\u003e\n    \u003cversion\u003e0.2.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## System compatibility\n\nSupports macOS, windows, Linux\n\n## If you use JNA\n\nIf you use JNA, this library also helps, actually, what it does is a needed step.\nYou do not need loadLibrary when used with JNA, just be sure to \"makeAvailable\"\nbefore JNA loading phase.\n\n## Get started\n\nMake some arbitrary native library in your classpath available to your java process, make it from\nyour java code before your first load of the native library or at the bootstrapping of your process.\nusage:\n\n```java\nmakeAvailable(new String[]{\"libfoo.dll\"});  // 3 overloads for your need.\n// Now your library ready to load your library.\n```\n\nWe can use other overloaded mehods:\n\n```java\nMap\u003cString, InputStream\u003e m = new HashMap();\nm.put(\"libfoo.dll\", classLoader.getResourceAsStream(\"libfoo.dll\"));\nm.put(\"native/libbar.dll\", classLoader.getResourceAsStream(\"native/libbar.dll\"));\nmakeAvailable(m);\n```\n\n### A detailed example\n\nNow we have a native dynamic load library named `foo` to load into your java process, and our\nresources folder like this.\n\n```\nsrc/main/resources\n            ├── libfoo.dylib      // The library you are interested in.\n            └── libbar.dylib      // Some library that \"libfoo.dylib\" depends on.\n```\n\nHere is how to make things work.\n\n```java \nimport static io.github.zhongwm.commons.native_lib_preparer.NativeLibPreparer.makeAvailable;\n\ntry {\n    String[] entryPaths = new String[]{\n        \"libfoo.dylib\",\n        \"libbar.dylib\",\n    };\n\n    // The only step needed before your loading\n    makeAvailable(entryPaths);\n    \n    // Now we are ok to load the native lib.\n    if (! libPath.equals(System.getProperty(\"user.dir\"))) { \n        System.loadLibrary(\"foo\");\n        System.out.println(\"Library loaded...\");\n    }\n} catch (URISyntaxException e) {\n    e.printStackTrace();\n} catch (IOException e) {\n    e.printStackTrace();\n}\n```\n\n### Can load libraries into a different layout than classpath.\n\n```java\n    @Test\n    public void testLoadMyLibToDifferentDir() throws IOException {\n        ClassLoader classLoader = getClass().getClassLoader();\n\n        Map\u003cString, InputStream\u003e m = new HashMap\u003c\u003e();\n        m.put(\"libfoo.dll\", classLoader.getResourceAsStream(\"libfoo.dll\"));\n        m.put(\"libbar.dll\", classLoader.getResourceAsStream(\"native/libbar.dll\"));\n        makeAvailable(m);\n\n        File toCheckFoo = Paths.get(\"libfoo.dll\").toFile();\n        System.out.println(toCheckFoo.getAbsolutePath());\n        assertTrue(toCheckFoo.exists());\n        assertTrue(toCheckFoo.isFile());\n\n        File toCheckBar = Paths.get(\"libbar.dll\").toFile();\n        System.out.println(toCheckBar.getAbsolutePath());\n        assertTrue(toCheckBar.exists());\n        assertTrue(toCheckBar.isFile());\n    }\n```\n\n### Can work on different level of native libraries\n\n```java\n    @Test\n    public void testLoadMyLib() throws IOException {\n        ClassLoader classLoader = getClass().getClassLoader();\n\n        Map\u003cString, InputStream\u003e m = new HashMap\u003c\u003e();\n        m.put(\"libfoo.dll\", classLoader.getResourceAsStream(\"libfoo.dll\"));\n        m.put(\"native/libbar.dll\", classLoader.getResourceAsStream(\"native/libbar.dll\"));\n        makeAvailable(m);\n\n        File toCheckFoo = Paths.get(\"libfoo.dll\").toFile();\n        System.out.println(toCheckFoo.getAbsolutePath());\n        assertTrue(toCheckFoo.exists());\n        assertTrue(toCheckFoo.isFile());\n\n        File toCheckBar = Paths.get(\"native\", \"libbar.dll\").toFile();\n        System.out.println(toCheckBar.getAbsolutePath());\n        assertTrue(toCheckBar.exists());\n        assertTrue(toCheckBar.isFile());\n    }\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhongwm%2Fnative-lib-preparer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhongwm%2Fnative-lib-preparer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhongwm%2Fnative-lib-preparer/lists"}