我正在 Eclipse 中编写一个简单的演示 JNI 项目来集成 Java 和 C 代码。我已经为 Eclipse 安装了 CDT 插件来执行此操作。 与this project structure我的 HelloJNI java 文件位于 Eclipse 的“(默认包)”中,并且使用 makefile 生成 HelloJNI.h C 头文件没有任何问题。
我的生成文件:
# 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
问题是我不知道如何让它与位于 com.example 等包(而不是默认包)内的 HelloJNI.java 一起工作。即this structure 。当运行相同的 make 目标时,我得到错误输出:
make: *** No rule to make target 'HelloJNI.class', needed by 'HelloJNI.h'. Stop.
我尝试将包名称添加到 javah 命令中:
javah -classpath $(CLASS_PATH) com.example.HelloJNI
...但得到同样的错误。
我尝试将类路径更改为:
CLASS_PATH = ../bin/com/example
...但出现以下错误:
make HelloJNI.h
javah -classpath ../bin/com/example HelloJNI
Error: Could not find class file for '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
如果你愿意的话,你可以把它打扮一下。我在自己的 Makefile 中使用了一些更干燥且自动化程度更高的东西,但我正在尝试理解关键点。特别是:
表达正确的必备文件(.class 文件,位于正确的目录中)。如果您没有正确执行此操作,那么您的 header 有时会在不需要时被重建,和/或在需要时不被更新。是。
为
javah
指定适当的-classpath
;这遵循表达类路径的普通 Java 规则。为
javah
指定正确的完全限定类名。使用
-force
选项,否则javah
将拒绝替换已经存在的 header 。当您手动调用javah
时,这种默认行为是合理的,但是当您尝试使用make
来保持 JNI header 保持最新时,它会让您陷入困境。当然,您不能对这些 header 进行手动修改,因为此类修改可能会被破坏。
关于java - 包中包含 .java 文件的 Eclipse JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798220/