【发布时间】:2014-05-27 20:52:15
【问题描述】:
复制说明 http://stuf.ro/calling-c-code-from-java-using-jna 从java调用C代码我有:
/* ctest.c */
#include <stdio.h>
void helloFromC()
{
printf("Hello from C!\n");
}
这是使用以下方法编译到库中的: gcc -o libctest.so -shared ctest.c
那么Java调用程序是:
import com.sun.jna.Library;
import com.sun.jna.Native;
public class HelloWorld
{
public interface CTest extends Library
{
public void helloFromC();
}
public static void main(String argv[])
{
CTest ctest = (CTest) Native.loadLibrary("ctest", CTest.class);
ctest.helloFromC();
}
}
然后使用 -cp 类路径参数在 Java8 中编译 java:
javac HelloWorld.java -cp jna.jar
这一步有效,生成了两个类文件,HelloWorld.class 和 HelloWorld$1.class。
执行步骤不起作用:
java HelloWorld -cp jna.jar
而不是产生以下输出:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Library
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at HelloWorld.main(HelloWorld.java:14)
Caused by: java.lang.ClassNotFoundException: com.sun.jna.Library
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 13 more
输出实际上等同于:JNA example program java.lang.NoClassDefFoundError,我已经仔细检查过。
我在 cygwin 下运行了许多 java8 测试,它们都可以正常工作,但这个不行。 我已经构建了这个示例的许多排列,包括创建 sun.com.jna 目录并在包中包含 HelloWorld。我还使用了在某些情况下需要的不同分隔符。他们都失败了。我错过了什么?
【问题讨论】: