{"id":16207803,"url":"https://github.com/netpyoung/pt.c-interop-in-clojure","last_synced_at":"2025-03-19T08:30:37.262Z","repository":{"id":38399153,"uuid":"182540391","full_name":"netpyoung/pt.c-interop-in-clojure","owner":"netpyoung","description":"https://youtu.be/40cvevHg0J8","archived":false,"fork":false,"pushed_at":"2020-07-19T15:34:38.000Z","size":15,"stargazers_count":14,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-17T05:03:16.358Z","etag":null,"topics":["clojure","ffi","interop","java"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/netpyoung.png","metadata":{"files":{"readme":"README.org","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":"2019-04-21T13:58:54.000Z","updated_at":"2025-03-08T17:40:50.000Z","dependencies_parsed_at":"2022-08-25T06:11:40.160Z","dependency_job_id":null,"html_url":"https://github.com/netpyoung/pt.c-interop-in-clojure","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netpyoung%2Fpt.c-interop-in-clojure","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netpyoung%2Fpt.c-interop-in-clojure/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netpyoung%2Fpt.c-interop-in-clojure/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netpyoung%2Fpt.c-interop-in-clojure/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/netpyoung","download_url":"https://codeload.github.com/netpyoung/pt.c-interop-in-clojure/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244389645,"owners_count":20444977,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["clojure","ffi","interop","java"],"created_at":"2024-10-10T10:14:32.947Z","updated_at":"2025-03-19T08:30:36.861Z","avatar_url":"https://github.com/netpyoung.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"* Table of Contents                                                     :TOC:\n- [[#interop-with-c-in-clojure][Interop with C in Clojure]]\n- [[#problem][problem]]\n- [[#java--c-binding][Java \u0026 C Binding]]\n  - [[#jni][JNI]]\n  - [[#jna][JNA]]\n  - [[#jnr][JNR]]\n  - [[#skip-javacpp][SKIP JavaCPP]]\n  - [[#panama][Panama]]\n  - [[#performance-check][performance check]]\n- [[#jni-example][JNI Example]]\n- [[#jna-example][JNA Example]]\n- [[#jnr-example][JNR Example]]\n- [[#skip-javacpp-example][SKIP JavaCPP Example]]\n- [[#panama-example][Panama Example]]\n- [[#jna-example-sdl2][JNA Example (SDL2)]]\n- [[#panama-example-sdl2][Panama Example (SDL2)]]\n- [[#sdl][SDL]]\n- [[#sdl-language-bindings][SDL Language Bindings]]\n- [[#commonlisp][CommonLisp?]]\n- [[#java][Java?]]\n- [[#clojure][Clojure?]]\n- [[#java-interop-types][java interop types]]\n\n* Interop with C in Clojure\n  - [[https://www.slideshare.net/netpyoung/interop-with-c-in-clojure][slideshare]]\n\n* problem\n  - How to load library.\n  - writing wrapper function.\n  - C structure layout for pointer access.\n\n* Java \u0026 C Binding\n  | name    |    date |\n  |---------+---------|\n  | JNI     | 1997.02 |\n  | JNA     | 2007.05 |\n  | JNR     | 2013.02 |\n  | JavaCPP | 2015.07 |\n  | panama  |     EAB |\n\n** JNI\n   - https://docs.oracle.com/javase/8/docs/technotes/guides/jni/\n   - from JDK 1.1\n** JNA\n   - https://github.com/java-native-access/jna\n** JNR\n   - https://github.com/jnr/jnr-ffi\n     - jnr-ffi is a Java library for loading native libraries without writing JNI code by hand, or using tools such as SWIG.\n   - https://www.slideshare.net/skrb/jnr-java-native-runtime\n   - https://www.oracle.com/technetwork/java/jvmls2013nutter-2013526.pdf\n** SKIP JavaCPP\n** Panama\n   - https://openjdk.java.net/projects/panama/\n   - https://download.java.net/java/early_access/panama/docs/api/java.base/java/foreign/package-summary.html\n   - [[https://www.youtube.com/watch?v=cfxBrYud9KM][Panama: A Foreign Policy for Java by Maurizio Cimadamore]]\n   - [[https://www.youtube.com/watch?v=49GUljUmGHg][Going Meta to Valhalla \u0026 Panama with John Rose]]\n** performance check\n   https://github.com/yulewei/java-ffi-demo\n   JNI \u003e JNR \u003e JNA (Direct Mapping) \u003e JNA (Interface Mapping)\n\n* JNI Example\n  1. prepare native c library\n  2. =writing= \u0026\u0026 compile interop java file\n  3. generate interop c header\n  4. =writing= \u0026\u0026 c`mpile interop c library\n  5. =writing= \u0026\u0026 build clojure project with interop java file\n  6. call ~clojure library~ with ~native c library~ and ~interop c library~\n\n* JNA Example\n  1. prepare native c library\n  2. =writing= \u0026\u0026 build clojure project\n\n* JNR Example\n  1. prepare native c library\n  2. =writing= \u0026\u0026 build clojure project\n* SKIP JavaCPP Example\n* Panama Example\n\n* JNA Example (SDL2)\n  SDL2(C language) binding in clojure\n* Panama Example (SDL2)\n  SDL2(C language) binding in clojure\n\n* SDL\n  - Simple DirectMedia Layer\n  - cross-platform development library.\n  - designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware\n  - via OpenGL and Direct3D\n\n* SDL Language Bindings\n  https://www.libsdl.org/languages.php\n\n  Ada\n  C#\n  D\n  Go\n  Lua\n  OCaml\n  Pascal\n  Python\n  Rust\n\n* CommonLisp?\n  - lispbuilder-sdl - https://github.com/lispbuilder/lispbuilder\n\n* Java?\n - java: https://github.com/javasdl/libjavasdl\n   JNA\n\n* Clojure?\n  - Demo clojure with SDL2 (panama)\n    - https://www.youtube.com/watch?v=40cvevHg0J8\n\n* java interop types\n  - https://www.slideshare.net/SeanLo4/jnainfo-52738038\n\n  | Native Type        |     Size | Java Type  | Common Windows Type   |\n  |--------------------+----------+------------+-----------------------|\n  | char               |        8 | byte       | BYTE, TCHAR           |\n  | short              |       16 | short      | short WORD            |\n  | wchar_t            |    16/32 | char       | WCHAR, TCHAR          |\n  | int                |       32 | int        | DWORD                 |\n  | int                |          | boolean    | BOOL                  |\n  | long               |    32/64 | NativeLong | LONG                  |\n  | long long, __int64 |       64 | long       |                       |\n  | float              |       32 | float      |                       |\n  | double             |       64 | double     |                       |\n  | char*              | C String | String     | LPCTSTR               |\n  | void*              |  pointer | Pointer    | LPVOID, HANDLE, LPXXX |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetpyoung%2Fpt.c-interop-in-clojure","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnetpyoung%2Fpt.c-interop-in-clojure","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetpyoung%2Fpt.c-interop-in-clojure/lists"}