我有一个名为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文件名为main.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
当我回显$ 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找不到的问题。