运行JNI程序时出现"java/lang/NoClassDefFoundError: java/lang/Object"错误

3

我为安装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;
}

当我运行它时,它打印出以下消息:

VM 初始化期间发生错误
java/lang/NoClassDefFoundError: java/lang/Object

我发誓我已经设置了 CLASSPATH。


通常情况下,当我看到“找不到java/lang/Object”时,意味着无法找到Java运行时环境(也称为JVM)。 - Chris Aldrich
1个回答

0

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

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


hdfsConnect会为我创建一个JVM。我解决了这个问题,libhdfs获取了某个路径中的jar包,而不是CLASSPATH,我不知道原因。 - renenglish
我复制了你在 http://www.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 时,它会打印出以下信息: Error occurred during initialization of VM Unable to load native library: /usr/libjava.so: cannot open shared object file: No such file or directory - renenglish
@renenglish,所以他们在特定路径寻找jars,是吗?很糟糕。至于找不到libjava.so,我认为JAVA_HOME可能没有设置好。在Windows上,库文件(java.dll)会在JAVA_HOME\bin下。 - Ustaman Sangat
好的,库java.dll(或libjava.lib)似乎是JRE的一部分,而不是JDK。不确定这是否有影响。 - Ustaman Sangat
现在我解决了这个问题,我将libjvm.so复制到了/usr/lib64目录下,当我链接时,出现了问题:它找不到所依赖的库。正确的方法是使用-Wl,-rpath选项链接位于$JAVA_HOME(对于我来说是:/ usr / java / jdk1.6.0_25 / jre / lib / amd64 / server / libjvm.so)中的libjvm.so。 - renenglish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接