调用Haskell函数从Java返回String

时间:2014-05-13 10:41:27

标签: java haskell types ghc ffi

我想调用一个对文本进行操作并返回文本的Haskell函数(实际上处理很复杂,Haskell代码被分成几个模块,但事实并非如此)。

我尝试了这里描述的方法:Communication between Java and Haskell并修改它以使用字符串。

但是我收到了错误:

 error:   initializing argument 1 of ‘void* myFunction_hs(HsPtr)’ [-fpermissive]
 extern HsPtr myFunction_hs(HsPtr a1);
              ^

相关代码和编译在这里: 在哈斯克尔:

foreign export ccall myFunction_hs :: CString -> IO CString
Java中的

import com.googlecode.javacpp.*;
import com.googlecode.javacpp.annotation.*;

@Platform(include={"<HsFFI.h>","myModule_stub.h"})
public class MyModule {
    static { Loader.load(); }
    public static native void hs_init(int[] argc, @Cast("char***") @ByPtrPtr PointerPointer argv);
    public static native String myFunction_hs(String text);
    public static void main(String[] args) {
        hs_init(null, null);
        String s = myFunction_hs("This is some String.");
        System.out.println("Result: " + s);
    }
}

汇编:

$ ghc -fPIC  -c -O myModule.hs
$ javac -cp javacpp.jar MyModule.java 
$ java -jar javacpp.jar -Dcompiler.path=ghc -Dcompiler.output.prefix="-optc-O3 -Wall MyModule.o -dynamic -fPIC -shared -lstdc++ -lHSrts-ghc7.6.3 -o " -Dcompiler.linkpath.prefix2="-optl -Wl,-rpath," MyModule

你知道出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题。

您需要编辑myModule_stub.h文件(它是自动生成的)。 在我的情况下,我不得不改变这条线:

extern HsPtr myFunction_hs(HsPtr a1);

到:

extern char* myFunction_hs(const char* a1);

当然,您应该在手动编辑后将myModule_stub.h重命名为myModule.h。否则它将被GHC覆盖,您的特定类型将丢失。