inline-java: Java interop via inline Java code in Haskell modules.

[ bsd3, ffi, java, jvm, library ] [ Propose Tags ]

Please see README.md.


[Skip to Readme]
Versions [faq] 0.1, 0.5, 0.5.1, 0.6, 0.6.1, 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.7.0, 0.7.1, 0.7.2, 0.8.0, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.9.0, 0.9.1 (info)
Change log CHANGELOG.md
Dependencies base (>=4.14.0.0 && <5), bytestring (>=0.10), Cabal (>=1.24.2), directory (>=1.2), filepath (>=1), ghc (>=8.10.1 && <=8.11), jni (==0.7.*), jvm (==0.5.*), language-java (>=0.2), linear-base (==0.1.0.0), mtl (>=2.2.1), process (>=1.2), template-haskell (>=2.10), temporary (>=1.2), text (>=1.2) [details]
License BSD-3-Clause
Copyright 2015-2016 EURL Tweag.
Author Tweag I/O
Maintainer m@tweag.io
Category FFI, JVM, Java
Home page http://github.com/tweag/inline-java#readme
Source repo head: git clone https://github.com/tweag/inline-java
Uploaded by FacundoDominguez at 2020-07-16T19:50:56Z
Distributions NixOS:0.9.1
Downloads 9267 total (53 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs uploaded by user
Build status unknown [no reports yet]

Modules

[Index] [Quick Jump]

Flags

NameDescriptionDefaultType
linear-types

Build the linear types interface.

DisabledAutomatic

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for inline-java-0.9.1

[back to package description]

inline-java: Call any JVM function from Haskell

CircleCI Build status

The Haskell standard includes a native foreign function interface (FFI). Using it can be a bit involved and only C support is implemented in GHC. inline-java lets you call any JVM function directly, from Haskell, without the need to write your own foreign import declarations using the FFI. In the style of inline-c for C and inline-r for calling R, inline-java lets you name any function to call inline in your code. It is implemented on top of the jni and jvm packages using a GHC Core plugin to orchestrate compilation and loading of the inlined Java snippets.

Example

Graphical Hello World using Java Swing:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Text (Text)
import Language.Java
import Language.Java.Inline

main :: IO ()
main = withJVM [] $ do
    message <- reflect ("Hello World!" :: Text)
    [java| {
      javax.swing.JOptionPane.showMessageDialog(null, $message);
      } |]

Building it

Requirements:

  • the Stack build tool;
  • either, the Nix package manager,
  • or, OpenJDK installed from your distro.

To build:

$ stack build

You can optionally get Stack to download a JDK in a local sandbox (using Nix) for good build results reproducibility. This is the recommended way to build inline-java. Alternatively, you'll need it installed through your OS distribution's package manager for the next steps (and you'll need to tell Stack how to find the JVM header files and shared libraries).

To use Nix, set the following in your ~/.stack/config.yaml (or pass --nix to all Stack commands, see the Stack manual for more):

nix:
  enable: true

Building the safe interface

There is [an experimental interface][safe-interface] which catches common memory management mistakes at compile time. This interface currently needs a fork of GHC which supports the LinearTypes language extension. Both the GHC fork and the safe interface can be built with:

$ stack --nix --stack-yaml stack-linear.yaml build inline-java

For examples of how to use the safe interface you can check the directory server or the wizzardo-http benchmark.

Further reading

Check the tutorial on how to use inline-java. If you want to know more about how it is implemented, look at our post on the plugin implementation.

Debugging

The generated java output can be dumped to stderr by passing to GHC

-fplugin-opt=Language.Java.Inline.Plugin:dump-java

If -ddump-to-file is in effect (as when using stack), the java code is dumped to <module>.dump-java instead.

License

Copyright (c) 2015-2016 EURL Tweag.

All rights reserved.

inline-java is free software, and may be redistributed under the terms specified in the LICENSE file.

Sponsors

         <img src="http://i.imgur.com/0HK8X4y.png" height="65">              LeapYear

inline-java is maintained by Tweag I/O.

Have questions? Need help? Tweet at @tweagio.