Question

I can compile this JNA example code (from step 2 of https://github.com/twall/jna/#getting_started):

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]);
        }
    }
}

...using javac -classpath .:jna.jar -g HelloWorld.java without error. (I downloaded jna.jar and put it in the same directory as HelloWorld.java for now.)

But when I run it using java -classpath .:jna.jar HelloWorld, I get:

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)

I get the exact same exception on Mac OS X and Linux.

How do I get this to run?

Was it helpful?

Solution

This example (as well as vast majority of java classes) uses packages:

package com.sun.jna.examples;

In order to compile / run it properly you need to run javac / java from the "root" folder (e.g. folder where "com" is located):

Let's say you have a folder called examples. You'd put both the jna.jar and the source code in it preserving folder structure:

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

You compile and run using:

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

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

Note the path separators in the former case and dots in the latter.

OTHER TIPS

Either just remove this line and recompile (which is fine in this case as you just try out some sample)

package com.sun.jna.examples;

or read up on what packages in java are and how they have to be handled (ChssPly76s Posts as a starter).

Better choose the second option as sooner or later (probably sooner) you will have to deal with packages anyway. So just take the time now to read up on it.

Here is a good example (in Spanish), http://bdevmex.blogspot.mx/2013/01/comunicar-aplicaciones-mediante-jna.html I hope that this can help you

In Eclipse, under Java Build path > Order and export, select export jna.jar.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top