gpt4 book ai didi

java - 尝试使用 JNI : libjvm. 在 C++ 代码中使用 jar 时出错,因此未找到

转载 作者:行者123 更新时间:2023-11-30 10:20:57 25 4
gpt4 key购买 nike

我有一个名为 Untitled.jar 的 jar 文件,它可以打印一些文本消息。它有一个 void 函数调用 giveMeString(),类名是 xegerImplementation。

giveMeString() 为 giveMeString() 中定义的正则表达式生成字符串。我需要在给定 C++ 中的正则表达式的情况下生成字符串。由于 java 有一个名为 xeger 的库可以执行此操作,所以我想创建一个 jar,然后将其导入到 c++ 代码中。

我已经实现了从 https://docs.oracle.com/javase/9/docs/specs/jni/invocation.html 获得的以下代码并调整它以匹配我的 jar 文件。

cpp 文件名为ma​​in.cpp,包含以下代码。

#include <iostream>
#include "jni.h"
int main(){
JavaVM *jvm; /* denotes a Java VM */
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 9 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=/home/aaa/Desktop/Untitled.jar";
vm_args.version = JNI_VERSION_1_8;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface
* pointer in env */
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
delete options;
/* invoke the Main.test method using the JNI */
jclass cls = env->FindClass("xegerImplementation");
jmethodID mid = env->GetStaticMethodID(cls, "giveMeString", "(I)V");
env->CallStaticVoidMethod(cls, mid);
/* We are done. */
jvm->DestroyJavaVM();
}

当我使用 g++ main.cpp -o main 生成可执行主文件时。但它给了我以下错误:

/tmp/ccf3LtdA.o: In function `main':
main.cpp:(.text+0x5d): undefined reference to `JNI_CreateJavaVM'
collect2: error: ld returned 1 exit status

然后在stackoverflow的帮助下,我用下面的代码编译解决了这个错误:

g++ -g -I/usr/lib/jvm/java-8-oracle/include/ -I/usr/lib/jvm/java-8-oracle/include/linux/ -L/usr/bin/java -L/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/ main.cpp -o main -ljvm

它生成可执行主文件。

然后,我尝试使用以下命令运行可执行主文件

./main

它给我以下错误:

./main: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory

我尝试将 libjvm.so 的路径添加到 LD_LIBRARY_PATH。但还是不行。

我做错了什么?任何帮助将不胜感激。

更新 1:我把libjvm.so文件复制到ubuntu的/lib文件夹下。现在它找到了错误的libjvm.so文件,错误消失了。现在有一种新的错误类型:

Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object

当我执行 echo $JAVA_HOME 时,它会给我以下信息:

/usr/lib/jvm/java-8-oracle

java -version 也可以正常工作。

更新 2:出现问题是因为我没有正确设置 LD_LIBRARY_PATH。现在我将它设置为 $JAVA_HOME/lib/amd64:$JAVA_HOME/jre/lib/amd64/server 这解决了找不到 libjvm.so 的问题。

最佳答案

出现问题是因为我没有正确设置 LD_LIBRARY_PATH。现在我将它设置为 $JAVA_HOME/lib/amd64:$JAVA_HOME/jre/lib/amd64/server 这解决了找不到 libjvm.so 的问题。

关于java - 尝试使用 JNI : libjvm. 在 C++ 代码中使用 jar 时出错,因此未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48069402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com