JavaH无法为JNI类创建C头文件

JavaH无法为JNI类创建C头文件,java,c++,class,java-native-interface,jna,Java,C++,Class,Java Native Interface,Jna,这真的让我很困惑,因为我已经尝试了关于类路径和其他各种事情的一切可能。我在windows、linux和IDE中尝试了各种不同的命令提示,但似乎没有任何帮助。总是同样的错误。任何见解都会有所帮助 尝试使用以下命令运行javah时出现以下错误: javah -jni -cp jna-3.0.9.jar:java.nio.*:java.util.* CameraInterfaceLibrary Error: Could not find class file for 'CameraInterfaceL

这真的让我很困惑,因为我已经尝试了关于类路径和其他各种事情的一切可能。我在windows、linux和IDE中尝试了各种不同的命令提示,但似乎没有任何帮助。总是同样的错误。任何见解都会有所帮助

尝试使用以下命令运行javah时出现以下错误:

javah -jni -cp jna-3.0.9.jar:java.nio.*:java.util.* CameraInterfaceLibrary
Error: Could not find class file for 'CameraInterfaceLibrary'.
我真的被困在这里了。我就是不明白为什么它拒绝生成头文件。不管我做什么,它总是说找不到类文件。我只是糊涂了。我尝试过更简单的示例,但对于实际代码,它无法工作

代码如下:

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

当您使用JNA时,不再需要生成C头或编译任何本机代码

使用直接映射时,声明的
native
方法会自动绑定到目标共享库中相应的方法

JNA使用方法签名和
StdCall
标记接口来确定如何通过适当的类型转换将Java调用转换为本地调用

编辑

确保在静态初始值设定项中调用
Native.register()
,而不是
Native.loadLibrary()
。如果你已经实现了一个工作模型,请在你的问题中添加注释


您可以通过编写一个简单的
main
函数来测试执行,该函数调用一个或多个方法。

当您使用JNA时,不再需要生成C头或编译任何本机代码

使用直接映射时,声明的
native
方法会自动绑定到目标共享库中相应的方法

JNA使用方法签名和
StdCall
标记接口来确定如何通过适当的类型转换将Java调用转换为本地调用

编辑

确保在静态初始值设定项中调用
Native.register()
,而不是
Native.loadLibrary()
。如果你已经实现了一个工作模型,请在你的问题中添加注释

您可以通过编写一个简单的
main
函数来测试执行,该函数调用您的一个或多个方法。

其他人是正确的(如果您使用JPA,则不需要javah)

但是为了彻底(以及帮助您处理Java开发中可能遇到的其他问题),我怀疑您的问题的答案是您没有正确指定类路径

以下是javah的文档:

我在命令行中看到的问题:

  • 适当的参数是-classpath(而不是-cp)
  • 您需要使用分号而不是冒号分隔条目
  • 必须指定类的根目录的路径(如果该目录恰好是当前目录,则仍必须使用“.”将其包括在内)
  • 必须指定依赖jar文件的路径
  • 在任何情况下,将类似导入的标识符添加到类路径都是没有意义的(即java.nio.*是一个导入-在这里没有相关性)
  • 如果您的类在一个包中(您应该这样做!),那么您需要在类名中包含它
  • 在普通项目中(类和依赖JAR存储在单独的文件夹中),我会使用如下内容:

    javah -jni -classpath C:\MyApp\Classes;C:\MyApp\lib\* com.myapp.MyAppLibrary
    
    注意,使用通配符加载lib\文件夹中的所有jar文件。

    其他人是正确的(如果使用JPA,则不需要javah)

    但是为了彻底(以及帮助您处理Java开发中可能遇到的其他问题),我怀疑您的问题的答案是您没有正确指定类路径

    以下是javah的文档:

    我在命令行中看到的问题:

  • 适当的参数是-classpath(而不是-cp)
  • 您需要使用分号而不是冒号分隔条目
  • 必须指定类的根目录的路径(如果该目录恰好是当前目录,则仍必须使用“.”将其包括在内)
  • 必须指定依赖jar文件的路径
  • 在任何情况下,将类似导入的标识符添加到类路径都是没有意义的(即java.nio.*是一个导入-在这里没有相关性)
  • 如果您的类在一个包中(您应该这样做!),那么您需要在类名中包含它
  • 在普通项目中(类和依赖JAR存储在单独的文件夹中),我会使用如下内容:

    javah -jni -classpath C:\MyApp\Classes;C:\MyApp\lib\* com.myapp.MyAppLibrary
    

    注意使用通配符加载lib\文件夹中的所有jar文件。

    为什么要尝试为JNA映射类生成C头文件?您不需要这样做,JNA直接映射可以在编译后立即运行,而不需要本机实现。也许我没有抓住要点,但JNA是用来取代Jni的,不是吗?因此,您仍然需要生成头文件来与您想要与之接口的C/C++代码接口,因此需要引用stdcall方法和C指针,还是我完全遗漏了什么?在没有Java代码头的情况下,我如何与C/C++接口?如果要替换JNI,则不需要执行任何JNI步骤或编写任何JNIC代码。否则JNA将毫无意义。为什么要尝试为JNA映射类生成C头文件?您不需要这样做,JNA直接映射可以在编译后立即运行,而不需要本机实现。也许我没有抓住要点,但JNA是用来取代Jni的,不是吗?因此,您仍然需要生成头文件来与您想要与之接口的C/C++代码接口,因此需要引用stdcall方法和C指针,还是我完全遗漏了什么?在没有Java代码头的情况下,我如何与C/C++进行接口呢?如果您要替换JNI,则不需要经过任何