Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EclipseJNI和包中的.java文件_Java_C_Eclipse_Makefile_Java Native Interface - Fatal编程技术网

EclipseJNI和包中的.java文件

EclipseJNI和包中的.java文件,java,c,eclipse,makefile,java-native-interface,Java,C,Eclipse,Makefile,Java Native Interface,我正在Eclipse中编写一个简单的JNI演示项目,以集成Java和C代码。为此,我安装了Eclipse的CDT插件。 使用,我将HelloJNI java文件放在Eclipse的“默认包”中,使用makefile生成HelloJNI.hc头文件没有问题 我的生成文件: # Define a variable for classpath CLASS_PATH = ../bin # Define a virtual path for .class in the bin directory vpa

我正在Eclipse中编写一个简单的JNI演示项目,以集成Java和C代码。为此,我安装了Eclipse的CDT插件。 使用,我将HelloJNI java文件放在Eclipse的“默认包”中,使用makefile生成HelloJNI.hc头文件没有问题

我的生成文件:

# Define a variable for classpath
CLASS_PATH = ../bin

# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

# $* matches the target filename without the extension
HelloJNI.h : HelloJNI.class
javah -classpath $(CLASS_PATH) HelloJNI
问题是,我不知道如何让HelloJNI.java在诸如com.example之类的包中而不是在默认包中工作。即。运行相同的make目标时,我得到错误输出:

make:**没有规则将目标设置为“HelloJNI.class”,这是“HelloJNI.h”所需要的。停下来

我试图将包名称添加到javah命令:

javah -classpath $(CLASS_PATH) com.example.HelloJNI
…但得到同样的错误

我试图将类路径更改为:

CLASS_PATH = ../bin/com/example
…但会出现以下错误:

做HelloJNI.h

javah-classpath../bin/com/example HelloJNI

错误:找不到“HelloJNI”的类文件


我需要用我的makefile做什么才能使它工作?

javah实用程序希望您为它提供要分析的类的完全限定名,并且它希望根据该名找到相对于类路径的类。因此,如果类的名称是
com.example.HelloJNI
,那么您可能会告诉
make
类似的内容:

CLASS_DIR = ../bin

HelloJNI.h : $(CLASS_DIR)/com/example/HelloJNI.class
    javah -force -classpath $(CLASS_DIR) com.example.HelloJNI
如果你想的话,你可以把它打扮一下。我在自己的Makefiles中使用了一些更干燥剂和自动化程度更高的东西,但我正在尝试理解关键点。特别是:

  • 表示正确的必备文件(正确目录中的.class文件)。如果您没有正确地执行此操作,则有时会在不需要时重新生成标头和/或在需要时不更新标头

  • 指定适当的
    -classpath
    javah
    ;这遵循表示类路径的常规Java规则

  • javah
    指定正确的完全限定类名

  • 使用
    -force
    选项,否则
    javah
    将拒绝替换已经存在的标题。当您手动调用
    javah
    时,这种默认行为是合理的,但是当您试图使用
    make
    使JNI头保持最新时,它会使您陷入困境。当然,也就是说,您不能手动修改这些标题,因为这样的修改很可能会失败