这可能听起来像一场噩梦,但我真的很想让它工作。我主要使用这个例子:从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中用作参考(在存根之前):(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: relocation R_X86_64_PC32 against undefined symbol `fibonacci_hs' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value collect2: ld returned 1 exit status
我并不是一个C语言专家,对此毫无头绪。我尝试以各种方式使用-fPIC编译,但仍然遇到相同的错误。你有任何想法我可能做错了什么吗?
谢谢!