【问题标题】:javah -jni <classname> not working?javah -jni <classname> 不工作?
【发布时间】:2017-04-30 20:32:24
【问题描述】:

我一直在尝试使用以下命令创建一个 .h 文件:

javah -jni MyClass

当然在做之后

javac MyClass.java

这不会给我任何错误消息...

但是,每当我执行 javah -jni 命令时,我都会收到以下错误:

Exception in thread "main" java.io.IOException: can't find class file
MyClass.class in 
java.net.URLClassLoader{urls=[file:/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre/lib/rt.jar], 
parent=gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}}
               at gnu.classpath.tools.javah.Main.getClass(libgcj-tools.so.14)
               at gnu.classpath.tools.javah.Main.parseClasses(libgcj-tools.so.14)
               at gnu.classpath.tools.javah.Main.run(libgcj-tools.so.14)
               at gnu.classpath.tools.javah.Main.main(libgcj-tools.so.14)

顺便说一下,我正在使用 Windows 10 电脑

【问题讨论】:

  • 1.您使用的是什么javah 命令行? 2. 你的课在包里吗? 3. 你为什么使用 GNU CLASSPATH?它像门钉一样死了。让它安息吧。使用 JDK。
  • 1.我只是在编译 MyClass.java 后直接键入 `javah -jni MyClass 2. 我的类不在包中 3. 我什至不知道我使用的是 GNU CLASSPATH,请赐教
  • 查看堆栈跟踪中的类名。 GNU CLASSPATH 是 FSF 提供开源 Java 的一次失败且注定失败的尝试。他们甚至从未完成 1.2,但由于某种原因,二十年后它仍然存在于 Linux 发行版中。删除它并安装 JDK。为什么堆栈跟踪中的类名与命令行中的类名不同?你编译了吗?
  • 关于堆栈跟踪中的不同类名,我只是复制了错误的错误。我确实编译了它...你介意解释如何删除 GNU CLASSPATH 吗?请原谅我在这方面完全是初学者
  • 我不知道。我猜想与RPM有关,但不要引用我的话。运行javah时的.class文件在当前目录吗?

标签: java c java-native-interface javah


【解决方案1】:

看看 MyClass 中定义的包。可能是你使用了一些包名,然后你只传递了类名——这是行不通的。

确保该类可通过 CLASSPATH 获得。

或者,您可以通过 javah 的 -cp 参数传递类位置(连同包)。

看这里:

http://jnicookbook.owsiak.org/recipe-No-001/

你可以在那里找到完全工作的、超级简单的示例。

它应该开箱即用。做吧:

git clone https://github.com/mkowsiak/jnicookbook.git
cd jnicookbook/recipes/recipeNo001
make; make test

如果您在这里仍有问题。可能是您的安装有问题。

如果它适合您,请确保使用与 Makefile 中类似的编译标志

享受 JNI 的乐趣 :)

更新:

正如上面cmets中已经指出的,也许你可以切换到Oracle的JDK?

如果您使用 Oracle 的 JDK,则不会出现此类问题。您可以使用 javah 轻松生成 C 标头

如果您必须坚持使用 GCJ(例如遗留代码),不妨试试

javah -jni -cp . Main

【讨论】:

  • OP 已经在 cmets 中明确表示他没有使用包名。
  • 啊...是的,现在我可以在评论中看到了 ;)
猜你喜欢
  • 2014-09-12
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多