我正试图使用CDT在Eclipse中创建一个JNI项目。我正在学习本教程。
因此,首先我将我的项目创建为Java项目,并在默认包中创建了一个HelloJNI
类,其中包含一些非常基本的代码。
然后,我在我的项目中添加了一个C性质,在"项目类型"中选择"Makefile项目",在"工具链"中选择了"Linux GCC"。
然后我创建了一个名为"jni"的新目录来存储所有的C代码。然后,我在eclipse中创建了一个名为"makefile"(注意小写名称(的新文件,并将其添加到其中
# 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
javac -h -classpath $(CLASS_PATH) $*
然后,我在jni文件夹中创建了一个名为"HelloJNI.h"的构建目标,它会自动使用makefile。然后我试图建立目标,但我得到了这个错误:
javac -h -classpath ../bin HelloJNI
javac: invalid flag: ../bin
Usage: javac <options> <source files>
use -help for a list of possible options
make: *** [makefile:9: HelloJNI.h] Error 2
我对错误信息感到困惑。javac是否将../bin
识别为标志?Eclipse中是否发生了一些奇怪的错误?如果我试图在终端中这样做,我会得到同样的错误。我试着寻找答案,但一无所获。
这是我的目录结构:
-bin
HelloJNI.class
-jni
makefile
-src
HelloJNI.java
编辑:将javac调用更改为
javac -h -classpath $CLASS_PATH $*
给了我以下错误:
error: Class names, 'LASS_PATH,HelloJNI', are only accepted if annotation processing is explicitly requested
起点
看看下面的教程,你的问题与";2.入门";,特别是";步骤2"-编译Java并生成C/C++头文件。
要重新访问,以下是您尝试过的:
javac -h -classpath ../bin HelloJNI
有几点。。
javac
的-h
选项指定一个目录。这个目录是生成的头文件应该放在的地方。它需要一个紧接其后的目录名,如下所示:-h directory
。在上面的尝试中,它使用了-h
选项,但没有指定目录。这是个问题- 这包括
-classpath ../bin
,这在本例中不是必需的。这不是问题,但它没有必要包含,可以删除 - "HelloJNI";不是编译器的合适输入-您需要指定一个";。java";文件名
修复
在教程中,他们展示了这个例子:
javac -h . HelloJNI.java
这是因为:
他们使用
-h
和"作为目录(其中"."表示"当前目录"(。他们正在编译.java文件——";HelloJNI.java";
此外,他们没有使用
-classpath
。该选项用于指定在哪里查找要编译的类文件(作为编译本身的输入(,但这与本教程示例无关–javac
没有任何必要的输入类。因此,只需完全删除-classpath ../bin
即可。
最后,如果你按照教程中发布的命令运行命令,事情应该会对你有用:
javac -h . HelloJNI.java
另外:JDK版本差异
您没有指定您使用的JDK版本,但如果您使用的是JDK的旧版本(8之前的版本(,则有随后的不同步骤(即除了使用javac
之外还使用javah
(。