【问题标题】:"java/lang/NoClassDefFoundError: java/lang/Object" when runs JNI program运行 JNI 程序时出现“java/lang/NoClassDefFoundError: java/lang/Object”
【发布时间】:2011-12-20 08:07:14
【问题描述】:

安装 scribe & hdfs 让我很痛苦。值得欣赏,我解决了大部分问题。但是,我被困在这里。

我安装了 libhdfs ,并编写了一个“Hello world”测试:

#include <iostream>
#include <string>
using namespace std;
#include "hdfs.h"

int main(int argc,char *argv[]){
    string host = "10.210.74.143";
    int port = 9000;
    hdfsFS fs = hdfsConnect(host.c_str(),port);
    return 0;
}

当我运行它时它会打印这个消息:

虚拟机初始化时发生错误
java/lang/NoClassDefFoundError: java/lang/Object

我发誓我已经设置了 CLASSPATH

【问题讨论】:

  • 通常当我看到找不到 java/lang/Object 这意味着它找不到 Java 运行时环境(又名 JVM)。

标签: java java-native-interface hdfs scribe


【解决方案1】:

首先,您正在运行 C 程序,而不是使用 Java 程序中的动态库。这真的是你打算做的吗?

如果是这样,也许你需要显式创建一个 JVM(有趣): 请参阅http://www.inonit.com/cygwin/jni/invocationApi/c.html,除非 hdfsConnect 函数为您完成。

【讨论】:

  • hdfsConnect 将为我创建一个 JVM。我解决了这个问题,libhdfs是在某个路径下获取jar包的,不是CLASSPATH,不知道是什么原因。
  • 我复制了你在inonit.com/cygwin/jni/invocationApi/c.html中给出的代码然后编译它:gcc -o hello hello.c -I /usr/java/jdk1.6.0_25/include/ -I/usr/java/ jdk1.6.0_25/include/linux -L /usr/java/jdk1.6.0_25/jre/lib/amd64/server/ -ljvm 但是当我运行 ./hello 时,它会打印:VM 初始化期间发生错误无法加载本机库:/usr/libjava.so:无法打开共享对象文件:没有这样的文件或目录
  • @renenglish,所以他们在特定路径中寻找罐子,对吧?真可惜。至于找不到 libjava.so,我认为 JAVA_HOME 可能没有正确设置。在 Windows 上,库 (java.dll) 将位于 JAVA_HOME\bin
  • 那么库 java.dll(或 libjava.lib)似乎是 JRE 的一部分,而不是 JDK。不知道这是否重要。
  • 现在我解决了这个问题,我将 libjvm.so 复制到 /usr/lib64 ,当我链接它时,问题是:它找不到它所依赖的库。正确的方法是使用 -Wl,-rpath 与 $JAVA_HOME 中的 libjvm.so 链接(对我来说是:/usr/java/jdk1.6.0_25/jre/lib/amd64/server/libjvm.so)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多