Questo probabilmente suona come un incubo, ma mi piacerebbe davvero farlo funzionare. Sto usando questo esempio per la maggior parte: Calling C from Haskell e sto cercando di farlo funzionare su Ubuntu.Chiamare Haskell da Java con C tra
sto facendo funzionare questo in Java:
package test;
public class JniTest {
public native int fib(int x);
}
questo in C dopo aver creato il file .h con javah: (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);
}
e poi per riferimento in Haskell (prima 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
e questo è quello che sto cercando di compilare con:
ghc -c -O Safe.hs
seguito da:
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
e sto ottenendo questo errore:
/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
io non sono un esperto di C con qualsiasi mezzo e non hanno idea di cosa fare di questo. Ho provato a compilare vari modi con -fPIC, ma ho continuato a ottenere lo stesso errore. Qualche idea su cosa potrei fare storto?
Grazie!
Il codice C non deve avviare il runtime Haskell da qualche parte? Penso che avrai bisogno di inserirlo nel codice da qualche parte, sia sul lato C che sul lato Java. –
Hai pensato di utilizzare JNA (https://github.com/twall/jna#readme) anziché JNI? – Landei
Ho risposto a questo qui: http://stackoverflow.com/questions/10370177/communication-between-java-and-haskell/10370902#10370902 –