java - 包中包含 .java 文件的 Eclipse JNI

标签 java c eclipse makefile java-native-interface

我正在 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 中使用了一些更干燥且自动化程度更高的东西,但我正在尝试理解关键点。特别是:

  1. 表达正确的必备文件(.class 文件,位于正确的目录中)。如果您没有正确执行此操作,那么您的 header 有时会在不需要时被重建,和/或在需要时被更新。是。

  2. javah指定适当的-classpath;这遵循表达类路径的普通 Java 规则。

  3. javah 指定正确的完全限定类名。

  4. 使用-force选项,否则javah将拒绝替换已经存在的 header 。当您手动调用 javah 时,这种默认行为是合理的,但是当您尝试使用 make 来保持 JNI header 保持最新时,它会让您陷入困境。当然,您不能对这些 header 进行手动修改,因为此类修改可能会被破坏。

关于java - 包中包含 .java 文件的 Eclipse JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798220/

相关文章:

java - 如何将类型化查询转换为条件生成器对象?

c - 之后打印一个电话

c - 如何使用 CDT 在 eclipse 中进行运行配置

c - 如何用\n 中断 scanf %d 循环

java - JPanel 错误 - 无法解析 J 组件

java - IntelliJ IDEA - 显示异常跟踪

java - Espresso 不等待键盘打开

java - 数组逻辑错误

java - 如何分析图形数据以找到顶部?

c - 将一行存储为字符串并稍后在 C 代码中输出