javah -jni <classname> 不起作用?

标签 java c java-native-interface javah

我一直在尝试使用以下命令创建 .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 电脑上工作

最佳答案

看一下 MyClass 中定义的包。您可能正在使用一些包名称,然后您只传递类名称 - 这是行不通的。

确保该类可通过 CLASSPATH 访问。

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

看这里:

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

您可以在那里找到完全有效、 super 简单的示例。

它应该开箱即用。只要这样做:

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

如果您仍然遇到问题。您的安装可能有些问题。

如果它适合您,只需确保使用在 Makefile 中可以找到的类似编译标志即可

享受 JNI 的乐趣:)

更新:

正如上面评论中已经指出的,也许您可​​以切换到 Oracle 的 JDK?

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

如果您必须坚持使用 GCJ(例如遗留代码),也许可以尝试一下

javah -jni -cp . Main

关于javah -jni <classname> 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43711036/

相关文章:

java - 向查询短语添加单词应在 Lucene 中过滤结果

java - 使用 Java EE 7 设置基本文档云

c - C双指针(矩阵)的基本问题

c++ - 在 C++ 中读取和写入同一个二进制文件

Java JNI - 在 main() 中调用得太晚的 native 方法

java - 优化原生 Android 代码 - 编译器标志

java - 如何在 Dockerized Spring Boot 应用程序中启用 https(未找到 PKCS12)

java - 如何将 Android 库项目转换为外部 JAR?

c - 意外的整数变化(内存溢出)

java - Maven 和 native 库