{ lib
, stdenv
, fetchFromGitHub
, ant
, jdk
, libffi
, pkg-config
, texinfo
, stripJavaArchivesHook
}:

stdenv.mkDerivation (finalAttrs: {
  pname = "jffi";
  version = "1.3.13";

  src = fetchFromGitHub {
    owner = "jnr";
    repo = "jffi";
    rev = "jffi-${finalAttrs.version}";
    hash = "sha256-aBQkkZyXZkaJc4sr/jHnIRaJYP116u4Jqsr9XXzfOBA=";
  };

  nativeBuildInputs = [
    ant
    jdk
    pkg-config
    texinfo
    stripJavaArchivesHook
  ];

  buildInputs = [ libffi ];

  # The pkg-config script in the build.xml doesn't work propery
  # set the lib path manually to work around this.
  env.LIBFFI_LIBS = "${libffi}/lib/libffi${stdenv.hostPlatform.extensions.sharedLibrary}";
  env.ANT_ARGS = "-Duse.system.libffi=1";

  buildPhase = ''
    runHook preBuild
    ant jar
    ant archive-platform-jar
    runHook postBuild
  '';

  doCheck = true;

  checkPhase = ''
    runHook preCheck
    ant test
    runHook postCheck
  '';

  installPhase = ''
    runHook preInstall
    install -Dm644 dist/*.jar -t $out/share/java
    runHook postInstall
  '';

  # nix can't detect libffi as a dependency inside the jar file, so we create
  # a dummy file with the path to libffi, to make sure that nix knows about it
  postFixup = ''
    mkdir -p $out/nix-support
    echo ${libffi} > $out/nix-support/depends
  '';

  meta = with lib; {
    broken = stdenv.isDarwin;
    description = "Java Foreign Function Interface";
    homepage = "https://github.com/jnr/jffi";
    platforms = platforms.unix;
    license = licenses.asl20;
    maintainers = with maintainers; [ bachp ];
  };
})
