【问题标题】:Eclipse JNI with .java file in packageEclipse JNI 与包中的 .java 文件
【发布时间】:2018-03-29 14:55:30
【问题描述】:

我正在 Eclipse 中编写一个简单的演示 JNI 项目来集成 Java 和 C 代码。我已经为 Eclipse 安装了 CDT 插件来执行此操作。 使用this project structure,我在 Eclipse 的“(默认包)”中有我的 HelloJNI java 文件,并且使用 makefile 生成 HelloJNI.h C 头文件没有问题。

我的 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
javah -classpath $(CLASS_PATH) HelloJNI

问题是我无法弄清楚如何让它与 HelloJNI.java 一起工作,它位于 com.example 等包中,而不是默认包中。即this structure。运行相同的 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 做些什么来完成这项工作?

【问题讨论】:

    标签: java c eclipse makefile java-native-interface


    【解决方案1】:

    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 中使用了一些 DRYer 和更多自动化的东西,但我正在尝试解决关键点。特别是:

    1. 表达正确的先决条件文件(.class 文件,在正确的目录中)。如果您没有正确执行此操作,那么您最终会导致您的标头有时会在不需要时被重建和/或 确实 需要时被更新是。

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

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

    4. 使用-force 选项,否则javah 将拒绝替换已存在的标头。当您手动调用 javah 时,该默认行为是合理的,但当您尝试使用 make 来保持 JNI 标头是最新的时,它会搞砸您。当然,您不能对这些标头进行手动修改,因为这样的修改很可能会被破坏。

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2012-04-13
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多