Search code examples
javac++classjava-native-interfacejna

JavaH failing to create C header file for JNI class


This is really baffling me as I have tried everything possible with regards to classpath and various other things. I have tried from various different commands prompts in windows, linux and IDEs but nothing seems to help. Always the same error. Any insight would help here.

I am getting the following error when trying to run javah with the following command:

javah -jni -cp jna-3.0.9.jar:java.nio.*:java.util.* CameraInterfaceLibrary
Error: Could not find class file for 'CameraInterfaceLibrary'.

I really am stuck here. I just can not figure out why it refuses to generate the header file. No matter what I do it consistently says it can't find the class file. I am just confused. I have tried much simpler examples but with real code it refuses to work.

The code is as follows:

import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.List;
/**
 * JNA Wrapper for library <b>CameraInterface</b><br>
 * This file was autogenerated by <a href="http://jnaerator.googlecode.com/">JNAerator</a>,<br>
 * a tool written by <a href="http://ochafik.com/">Olivier Chafik</a> that <a href="http://code.google.com/p/jnaerator/wiki/CreditsAndLicense">uses a few opensource projects.</a>.<br>
 * For help, please visit <a href="http://nativelibs4java.googlecode.com/">NativeLibs4Java</a> , <a href="http://rococoa.dev.java.net/">Rococoa</a>, or <a href="http://jna.dev.java.net/">JNA</a>.
 */
public class CameraInterfaceLibrary implements StdCallLibrary {
    public static final String JNA_LIBRARY_NAME = "CameraInterface";
    public static final NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(CameraInterfaceLibrary.JNA_LIBRARY_NAME);
    static {
        Native.loadLibrary(CameraInterfaceLibrary.JNA_LIBRARY_NAME, CameraInterfaceLibrary.class);
    }
    public static class DV_TM extends Structure {
        /**
         * Second.interval is [0.59] * /<br>
         * int tm_min; /* To the value interval [0.59]
         */
        public int tm_sec;
        /** Value seconds interval [0.23] */
        public int tm_hour;
        /** The value date of the month interval [1.31] */
        public int tm_mday;
        /** The value date of the month interval [1.31] */
        public int tm_mon;
        /** Month (from the beginning of January, o behalf of the month) value interval [0.11] */
        public int tm_year;
        /** Year, its value is equal to the actual year as 2010 */
        public int tm_wday;
        /** The value range for the week [0.6], where O stands for Sunday, 1 for Monday, and so on */
        public int tm_yday;
        /** Number of days from the beginning of January 1 each year ranging from [0.365], where 0 represents January 1, 1 represents January 2, and so on, can be set to 0 */
        public int tm_isdst;
        public DV_TM() {
            super();
        }
        protected List<? > getFieldOrder() {
            return Arrays.asList("tm_sec", "tm_hour", "tm_mday", "tm_mon", "tm_year", "tm_wday", "tm_yday", "tm_isdst");
        }
        /**
         * @param tm_sec Second.interval is [0.59] * /<br>
         * int tm_min; /* To the value interval [0.59]<br>
         * @param tm_hour Value seconds interval [0.23]<br>
         * @param tm_mday The value date of the month interval [1.31]<br>
         * @param tm_mon The value date of the month interval [1.31]<br>
         * @param tm_year Month (from the beginning of January, o behalf of the month) value interval [0.11]<br>
         * @param tm_wday Year, its value is equal to the actual year as 2010<br>
         * @param tm_yday The value range for the week [0.6], where O stands for Sunday, 1 for Monday, and so on<br>
         * @param tm_isdst Number of days from the beginning of January 1 each year ranging from [0.365], where 0 represents January 1, 1 represents January 2, and so on, can be set to 0
         */
        public DV_TM(int tm_sec, int tm_hour, int tm_mday, int tm_mon, int tm_year, int tm_wday, int tm_yday, int tm_isdst) {
            super();
            this.tm_sec = tm_sec;
            this.tm_hour = tm_hour;
            this.tm_mday = tm_mday;
            this.tm_mon = tm_mon;
            this.tm_year = tm_year;
            this.tm_wday = tm_wday;
            this.tm_yday = tm_yday;
            this.tm_isdst = tm_isdst;
        }

        /* JR - Removed as no deemed necessary at this point
        public DV_TM(com.sun.jna.Pointer peer) {
            super(peer);
        }*/

        public static class ByReference extends DV_TM implements Structure.ByReference {

        };
        public static class ByValue extends DV_TM implements Structure.ByValue {

        };
    };
    /**
     * Connected devices (connect with camera)<br>
     * Original signature : <code>int CConnectDV()</code><br>
     * <i>native declaration : line 18</i>
     */
    public static native int CConnectDV();
    /**
     * Disconnect the device (disconnect with camera)<br>
     * Original signature : <code>int CDisconnectDV()</code><br>
     * <i>native declaration : line 20</i>
     */
    public static native int CDisconnectDV();
    /**
     * Landing equipment parameters: password (connect and open the camera parameter: password)<br>
     * Original signature : <code>int CLogin(char*)</code><br>
     * <i>native declaration : line 22</i><br>
     * @deprecated use the safer methods {@link #CLogin(java.nio.ByteBuffer)} and {@link #CLogin(com.sun.jna.Pointer)} instead
     */
    public static native int CLogin(com.sun.jna.Pointer Password);
    /**
     * Landing equipment parameters: password (connect and open the camera parameter: password)<br>
     * Original signature : <code>int CLogin(char*)</code><br>
     * <i>native declaration : line 22</i>
     */
    public static native int CLogin(ByteBuffer Password);
    /**
     * The school parameters: see DV-TM structure (timing parameter: look at the DV-TM structure)<br>
     * Original signature : <code>int CSetTime(DV_TM*)</code><br>
     * <i>native declaration : line 24</i>
     */
    public static native int CSetTime(CameraInterfaceLibrary.DV_TM ptm);
    /**
     * Read machine time parameters: see DV-TM structure (read the machine time parameter: look at the DV-TM structure)<br>
     * Original signature : <code>int CGetTime(DV_TM*)</code><br>
     * <i>native declaration : line 26</i>
     */
    public static native int CGetTime(CameraInterfaceLibrary.DV_TM ptm);
    /**
     * Set password parameters: password new password 6 (set password parameter: password 6 new password)<br>
     * Original signature : <code>int CSetPassword(char*)</code><br>
     * <i>native declaration : line 28</i><br>
     * @deprecated use the safer methods {@link #CSetPassword(java.nio.ByteBuffer)} and {@link #CSetPassword(com.sun.jna.Pointer)} instead
     */
    public static native int CSetPassword(com.sun.jna.Pointer Password);
    /**
     * Set password parameters: password new password 6 (set password parameter: password 6 new password)<br>
     * Original signature : <code>int CSetPassword(char*)</code><br>
     * <i>native declaration : line 28</i>
     */
    public static native int CSetPassword(ByteBuffer Password);
    /**
     * Set the number parameter: ID Number 13 (set ID number parameter: 13 ID number)<br>
     * Original signature : <code>int CSetID(char*)</code><br>
     * <i>native declaration : line 30</i><br>
     * @deprecated use the safer methods {@link #CSetID(java.nio.ByteBuffer)} and {@link #CSetID(com.sun.jna.Pointer)} instead
     */
    public static native int CSetID(com.sun.jna.Pointer ID);
    /**
     * Set the number parameter: ID Number 13 (set ID number parameter: 13 ID number)<br>
     * Original signature : <code>int CSetID(char*)</code><br>
     * <i>native declaration : line 30</i>
     */
    public static native int CSetID(ByteBuffer ID);
    /**
     * Read the number parameter: ID Number 13 (read ID number parameter: 13 ID number)<br>
     * Original signature : <code>int CGetID(char*)</code><br>
     * <i>native declaration : line 32</i><br>
     * @deprecated use the safer methods {@link #CGetID(java.nio.ByteBuffer)} and {@link #CGetID(com.sun.jna.Pointer)} instead
     */
    public static native int CGetID(com.sun.jna.Pointer ID);
    /**
     * Read the number parameter: ID Number 13 (read ID number parameter: 13 ID number)<br>
     * Original signature : <code>int CGetID(char*)</code><br>
     * <i>native declaration : line 32</i>
     */
    public static native int CGetID(ByteBuffer ID);
    /**
     * Enter the U disk mode (Enter the U disk mode)<br>
     * Original signature : <code>int CIntoUDiskMode()</code><br>
     * <i>native declaration : line 34</i>
     */
    public static native int CIntoUDiskMode();
}

Solution

  • When you use JNA, there is no longer any need to generate C headers nor compile any native code.

    When using direct mapping, methods declared native are automatically bound to their corresponding methods in the target shared library.

    JNA uses the method signatures and StdCall tagging interfaces to figure out how to translate your Java call into a native call with the appropriate type conversions.

    EDIT

    Make sure you call Native.register() in your static initializer, rather than Native.loadLibrary(). Please add a note to your question if you've achieved a working model.

    You can test execution by writing a simple main function which calls one or more of your methods.