4

この JNA サンプル コードをコンパイルできます ( https://github.com/twall/jna/#getting_startedのステップ 2 から):

package com.sun.jna.examples;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Simple example of JNA interface mapping and usage. */
public class HelloWorld {

    // This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary)
            Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                               CLibrary.class);

        void printf(String format, Object... args);
    }

    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i=0;i < args.length;i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

...javac -classpath .:jna.jar -g HelloWorld.javaエラーなしで使用しています。(とりあえず jna.jar をダウンロードして、HelloWorld.java と同じディレクトリに置いておきます。)

しかし、を使用して実行するとjava -classpath .:jna.jar HelloWorld、次のようになります。

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: com/sun/jna/examples/HelloWorld)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

Mac OS X と Linux でまったく同じ例外が発生します。

これを実行するにはどうすればよいですか?

4

3 に答える 3

9

この例 (および大多数の Java クラス) では、パッケージを使用しています。

package com.sun.jna.examples;

適切にコンパイル/実行するには、「ルート」フォルダー (「com」があるフォルダーなど) から javac / java を実行する必要があります。

というフォルダがあるとしますexamplesjna.jarとソース コードの両方を、フォルダー構造を維持しながら入れます。

/examples
 jna.jar
 /com
   /sun
      /jna
         /examples
           HelloWorld.java

以下を使用してコンパイルおよび実行します。

javac -classpath .:jna.jar -g com/sun/jna/examples/HelloWorld.java

java -classpath .:jna.jar com.sun.jna.examples.HelloWorld

前者の場合はパス区切り記号、後者の場合はドットに注意してください。

于 2009-11-20T22:54:55.920 に答える
3

この行を削除して再コンパイルするだけです (この場合、いくつかのサンプルを試すだけなので問題ありません)。

package com.sun.jna.examples;

または、Javaのパッケージとは何か、およびそれらをどのように処理する必要があるかを読んでください(ChssPly76s Posts as a starter)。

遅かれ早かれ (おそらくもっと早く) 2 番目のオプションを選択することをお勧めします。とにかくパッケージを処理する必要があります。ですから、今すぐ時間をかけて読んでください。

于 2009-11-20T23:07:06.857 に答える