从 Java 调用 Haskell,中间使用 C
这可能听起来像是一场噩梦,但我真的很想让它工作。我大部分时间都在使用这个例子:从Haskell调用C,并试图让它在ubuntu上工作。
我在java中运行这个:
package test;
public class JniTest {
public native int fib(int x);
}
在用javah创建.h文件后,在c中:(test_JniTest.c)
#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 中作为参考(在 stub 之前):(Safe.hs)
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: 在制作共享对象时不能使用未定义符号“fibonacci_hs”的重新定位R_X86_64_PC32;使用 -fPIC /usr/bin/ld 重新编译:最终链接失败:错误值 collect2:ld 返回 1 退出状态
无论如何,我都不是c专家,也不知道该怎么办。我尝试使用-fPIC编译各种方法,但我一直得到相同的错误。任何想法,我可能做错了什么?
谢谢!