【问题标题】:Calling C from Java8 using JNA via cygwin通过 cygwin 使用 JNA 从 Java8 调用 C
【发布时间】: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。我还使用了在某些情况下需要的不同分隔符。他们都失败了。我错过了什么?

【问题讨论】:

    标签: java c cygwin jna


    【解决方案1】:

    看来您没有设置类路径。 NoClassDefFoundError表示你的ClassLoader找不到你编译的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      相关资源
      最近更新 更多