You are most welcome :-). For numerical computation, libjulia-clj <https://github.com/cnuernber/libjulia-clj> may interest you :-).
On Sat, Dec 5, 2020 at 8:06 AM John Doe <bufferlogh...@gmail.com> wrote: > Thank you Chris. It's very helpful. > > The approach you took for dtype-next is very interesting. This library is > closer to my work (numerical computation). Also, the efficient use of Java > heap is very interesting although I admit I don't know enough about it. > This reminds me of Rich Hickey's emphasis of understanding data structures. > > On Friday, December 4, 2020 at 4:52:25 PM UTC+1 ch...@techascent.com > wrote: > >> Ngwua, >> >> Looking through the caesium bindings just mentioned, it appears the >> author dynamically creates an interface and then you can simply ask the >> native library to instantiate a concrete implementation of that interface >> <https://github.com/lvh/caesium/blob/master/src/caesium/binding.clj#L701>. >> So you do not always have to create a class with 'native' methods. >> >> Integrating with C libraries is part of the reason I wrote dtype-next >> <https://github.com/cnuernber/dtype-next> which has the ability to >> efficiently write/read from either java heap or native heap storage. >> dtype-next has no dependency on either JNA or JNR. >> >> Hope this helps, >> >> Chris >> >> On Fri, Dec 4, 2020 at 7:53 AM John Doe <buffer...@gmail.com> wrote: >> >>> Hello Everyone, >>> >>> *Motivation:* I want to invoke C-code functions from Clojure: writing >>> Java functions in Clojure. >>> >>> *Plan of Attack:* Rather than go with the JNI approach I want to >>> interface with C-Library via JNR-FFI (https://github.com/jnr/jnr-ffi) >>> >>> Based on some example of using JNR-FFI >>> >>> https://github.com/jnr/jnr-ffi-examples/blob/master/getpid/src/main/java/getpid/Getpid.java >>> >>> https://www.programcreek.com/java-api-examples/?api=jnr.ffi.LibraryLoader >>> >>> The wrapper in Java might look like >>> ``` >>> package blahblah; >>> >>> public class BlahNative { >>> private static int[] intDummy; >>> private static double[] doubleDummy; >>> >>> public BlahNative() { >>> } >>> >>> public static native void native_a(char var0, char var1, int var2, int >>> var3, int var4, double[] var7, int var8, int var9); >>> >>> static { >>> lib = LibraryLoader >>> .create(LibSodium.class) >>> .search("/usr/local/lib") >>> .search("/opt/local/lib") >>> .search("/usr/lib") >>> .search("/lib") >>> .load(LIBRARY_NAME); >>> initializeLibrary(lib); >>> } >>> } >>> ``` >>> >>> Question: For my package >>> ``` >>> (defproject mypkg >>> :dependencies [[org.clojure/clojure "1.10.1"] >>> [com.github.jnr/jnr-ffi "2.2.0"]]) >>> ``` >>> How do I write the wrapper for the native functions in >>> ``` >>> (ns mypkg.native >>> (:import [jnr.ffi LibraryLoader]) >>> (:import [jnr.ffi.annotations IgnoreError]) >>> (:import [jnr.ffi.provider FFIProvider])) >>> ``` >>> For the Java interop I am assuming the above namespace should be based >>> on gen-class (http://clojure-doc.org/articles/language/interop.html). >>> >>> What is not clear to me is: >>> *1. How does one create the `native` method* (since most (defn foo) are >>> static methods)? >>> *2. How do I access the native functions after loading* the Native >>> Library (LibraryLoader.load(LIBRARY_NAME))? >>> >>> I am neither a C nor a Java expert so any guidance will be much >>> appreciated. >>> >>> Thanks, >>> Ngwua >>> >>> -- >>> >> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@googlegroups.com >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> clojure+u...@googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+u...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/clojure/3bd05d7a-297e-49cf-86d4-aec4a88c83cbn%40googlegroups.com >>> <https://groups.google.com/d/msgid/clojure/3bd05d7a-297e-49cf-86d4-aec4a88c83cbn%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/clojure/acd1be6c-5156-4316-98e2-e4df9d55566bn%40googlegroups.com > <https://groups.google.com/d/msgid/clojure/acd1be6c-5156-4316-98e2-e4df9d55566bn%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/CADbpEJsWbg2yLBC2EisLTjmENut3shCD_3dsCYrOE9dYYZO9mQ%40mail.gmail.com.