我想调用一个对文本进行操作并返回文本的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
你知道出了什么问题吗?
答案 0 :(得分:2)
我设法解决了这个问题。
您需要编辑myModule_stub.h文件(它是自动生成的)。 在我的情况下,我不得不改变这条线:
extern HsPtr myFunction_hs(HsPtr a1);
到:
extern char* myFunction_hs(const char* a1);
当然,您应该在手动编辑后将myModule_stub.h
重命名为myModule.h
。否则它将被GHC覆盖,您的特定类型将丢失。