从ABCL调用freeling Java API

时间:2013-07-09 19:49:09

标签: common-lisp swig abcl

我试图从ABCL(http://nlp.lsi.upc.edu/freeling/)调用Freeling(http://devel.cpl.upc.edu/freeling/svn/trunk/APIs/java/)Java API(http://common-lisp.net/project/armedbear/)。我按照Freeling Java API的README中的所有过程,使用swig编译API。之后,我能够运行示例代码。

java -Djava.library.path=. -cp freeling.jar:. Analyzer < teste.text > teste.out

在此Analyzer.java中,相关的行是:

...
import edu.upc.freeling.*;
...
System.loadLibrary( "freeling_javaAPI" );
...
MacoOptions op = new MacoOptions( LANG );

在ABCL我尝试过:

(add-to-classpath "/Users/arademaker/Downloads/myfreeling/APIs/java/freeling.jar")
(jstatic "load" "java.lang.System" "/Users/arademaker/Downloads/myfreeling/APIs/java/libfreeling_javaAPI.so")
(jnew "edu.upc.freeling.MacoOptions" "en")

但是我得到了错误:

Java exception 'java.lang.UnsatisfiedLinkError: edu.upc.freeling.freelingJNI.new_MacoOptions(Ljava/lang/String;)J'.
   [Condition of type JAVA-EXCEPTION]

有没有人有任何想法?带有System.load Java的ABCL的任何特殊问题?

2 个答案:

答案 0 :(得分:1)

在调用ABCL之后,从Lisp中使用JAVA:ADD-TO-CLASSPATH被认为是更好的形式。

 (java:add-to-classpath (probe-file #p"freeling.jar"))

应该提供更多信息。 ABCL有一个广泛的概念CL:PATHNAME

答案 1 :(得分:0)

根据http://thread.gmane.org/gmane.lisp.armedbear.devel/2923的Alessio Stalla的建议,我能够解决我的问题。解决方案是使用-jar参数加载ABCL而不是:

java -jar abcl.jar

但建议使用commaand:

java -Djava.library.path=. -cp freeling.jar:abcl.jar org.armedbear.lisp.Main

看起来-jar使java忽略-cp参数:

http://docs.oracle.com/javase/1.4.2/docs/tooldocs/linux/java.html

然而,它解释了部分神秘,因为我也试过:

(add-to-classpath "freeling.jar")

之前的

(jstatic "load" "java.lang.System" ".../libfreeling_javaAPI.so")
(jnew "edu.upc.freeling.MacoOptions" "en")

因此除了忽略“-cp”参数之外,使用“-jar”还有其他后果。