通过cygwin使用JNA从Java8调用C语言

时间:2014-05-27 20:52:15

标签: java c cygwin jna

重播说明书     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 classpath参数在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。我也使用了在某些情况下必要的不同分隔符。所有这些都失败了。我错过了什么?

1 个答案:

答案 0 :(得分:0)

您似乎没有设置类路径。 NoClassDefFoundError表示您的ClassLoader无法找到已编译的类。