首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java和C之间调用Haskell

在Java和C之间调用Haskell
EN

Stack Overflow用户
提问于 2011-11-01 08:41:17
回答 2查看 867关注 0票数 19

这听起来可能像噩梦,但我真的很想让它正常工作。我在很大程度上使用了这个例子:Calling C from Haskell,我正在尝试让它在ubuntu上运行。

我用java运行这段代码:

代码语言:javascript
复制
package test;

public class JniTest {
    public native int fib(int x);
}

这是在用javah:(test_JniTest.c)创建.h文件之后的c中的代码。

代码语言:javascript
复制
#include "test_JniTest.h"
#include "Safe_stub.h"

JNIEXPORT jint JNICALL Java_test_JniTest_fib(JNIEnv * e, jobject o, jint f)
{
  return fibonacci_hs(f);
}

然后在haskell中引用(在存根之前):(Safe.hs)

代码语言:javascript
复制
module Safe where

import Foreign.C.Types

fibonacci :: Int -> Int
fibonacci n = fibs !! n
    where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral

foreign export ccall fibonacci_hs :: CInt -> CInt

这是我尝试用来编译它的方法:

ghc -c -O Safe.hs

然后是:

ghc -shared -o libTest.jnilib -optc-O test_JniTest.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux

我得到了这个错误:

/usr/bin/ ld : test_JniTest.o:针对未定义符号的重定位R_X86_64_PC32创建共享对象时不能使用`fibonacci_hs‘;使用-fPIC重新编译/usr/bin/ld:最终链接失败:坏值collect2: ld返回1个退出状态

我无论如何都不是c语言专家,也不知道该怎么做。我尝试了用-fPIC的各种编译方法,但我总是得到相同的错误。你知道我可能做错了什么吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-04 14:02:51

虽然我已经在这里回答了这个问题:Communication between Java and Haskell,但由于这个问题更多的是关于错误本身,我将在这里添加详细信息。这个问题源于Haskell不能很好地支持共享库,而Java需要共享库。Buildings plugins as Haskell shared libs为我们提供了以下见解和解决方法:

原则上,您可以在链接步骤中使用不带-dynamic的-shared。这意味着静态地将所有的rts基库链接到您的新共享库中。这将创建一个非常大但独立的共享库。然而,这将要求所有的静态库都是使用-fPIC构建的,以便代码适合包含到共享库中,而我们目前不这样做。

如果我们再次使用ldd查看我们创建的libfoo.so,我们会注意到它缺少对rts库的依赖。这是我们还没有解决的问题,所以现在我们可以自己添加依赖项:

$ ghc --make -dynamic -shared -fPIC Foo.hs -o libfoo.so \ -lHSrts-ghc6.11 -opt Wl,-rpath,/opt/ghc/lib/ghc-6.11/

这是一种变通方法,因为它要求我们在构建时知道rts库的版本。

票数 3
EN

Stack Overflow用户

发布于 2011-11-02 05:29:36

如果您的目标是实际完成一些事情(而不是仅仅玩弄JNI),我建议将其作为一个普通的RPC问题来解决,并利用许多框架/协议中的一个:

Protocol Buffers from Google

Thrift from Facebook

Avro (well this is mostly a wire protocol)

从你正在尝试做的事情来看,Thrift可能是你最好的选择,因为它描述了一个完整的客户端/服务器RPC堆栈,但我非常确定它们中的任何一个都可以在一个简单的套接字上工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7961335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档