gpt4 book ai didi

java - 调用从 Java 返回字符串的 Haskell 函数

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:10 24 4
gpt4 key购买 nike

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

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

但是我得到了错误:

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

相关代码和编译在这里:在 Haskell 中:

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

你知道哪里出了问题吗?

最佳答案

我设法解决了这个问题。

您需要编辑 myModule_stub.h 文件(它是自动生成的)。就我而言,我不得不更改行:

extern HsPtr myFunction_hs(HsPtr a1);

到:

extern char* myFunction_hs(const char* a1);

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

关于java - 调用从 Java 返回字符串的 Haskell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23629000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com