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 <bufferlogh...@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 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/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/CADbpEJuH5i3Py17byfRR5zoiXUXFWzk-xLtX6iLzGRmnoHyb6g%40mail.gmail.com.

Reply via email to