我的C++代码: #include <jni.h> int main() { Using namespace std; JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) JNIEnv *env; // Pointer to native interface //================== prepare loading of Java VM ============================ JavaVMInitArgs vm_args; // Initialization arguments JavaVMOption* options = new JavaVMOption[1]; // JVM invocation options options[0].optionString = "-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin"; // where to find java .class vm_args.version = JNI_VERSION_1_6; // minimum Java version vm_args.nOptions = 1; // number of options vm_args.options = options; vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail //=============== load and initialize Java VM and JNI interface ============= jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !! delete options; // we then no longer need the initialisation options. if (rc != JNI_OK) { // TO DO: error processing... cin.get(); exit(EXIT_FAILURE); } //=============== Display JVM version ======================================= cout << "JVM load succeeded: Version "; jint ver = env->GetVersion(); cout << ((ver>>16)&0x0f) << "."<<(ver&0x0f) << endl; jclass cls2 = env->FindClass("Main"); // try to find the class if (cls2 == nullptr) { cerr << "ERROR: class not found !"; } else { // if class found, continue cout << "Class MyTest found" << endl; jmethodID mid2 = env->GetStaticMethodID(cls2, "callRestPost2", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (mid2 == nullptr) { cerr << "ERROR: method it main2(int) not found !" << endl; } else { jstring jstr1 = env->NewStringUTF("http://traffic.c3po.mantis.com.tr"); jstring jstr2 = env->NewStringUTF(c); jstring jstr3 = env->NewStringUTF("measured_At"); jstring jstr4 = env->NewStringUTF("Zevkli_Sokak"); env->CallStaticVoidMethod(cls2, mid2, jstr1, jstr2, jstr3, jstr4); cout << endl; } } jvm->DestroyJavaVM(); cin.get(); } #包括 int main() { 使用名称空间std; JavaVM*jvm;//指向jvm的指针(Java虚拟机) JNIEnv*env;//指向本机接口的指针 //===========================准备加载Java虚拟机============================ JavaVMInitArgs vm_args;//初始化参数 JavaVMOption*options=newJavaVMOption[1];//JVM调用选项 选项[0]。选项字符串=“-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin”;//在哪里可以找到java.class vm_args.version=JNI_version_1_6;//最低Java版本 vm_args.nOptions=1;//选项数 vm_args.options=选项; vm_args.ignoreunrecogned=false;//无效选项会导致JVM初始化失败 //================加载并初始化Java VM和JNI接口============= jint rc=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);//是!! 删除选项;//这样我们就不再需要初始化选项了。 如果(rc!=JNI_OK){ //要执行的操作:错误处理。。。 cin.get(); 退出(退出失败); } //===================显示JVM版本======================================= coutgetversion(); cout>16)&0x0f),java,c++,spring,java-native-interface,Java,C++,Spring,Java Native Interface" /> 我的C++代码: #include <jni.h> int main() { Using namespace std; JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) JNIEnv *env; // Pointer to native interface //================== prepare loading of Java VM ============================ JavaVMInitArgs vm_args; // Initialization arguments JavaVMOption* options = new JavaVMOption[1]; // JVM invocation options options[0].optionString = "-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin"; // where to find java .class vm_args.version = JNI_VERSION_1_6; // minimum Java version vm_args.nOptions = 1; // number of options vm_args.options = options; vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail //=============== load and initialize Java VM and JNI interface ============= jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !! delete options; // we then no longer need the initialisation options. if (rc != JNI_OK) { // TO DO: error processing... cin.get(); exit(EXIT_FAILURE); } //=============== Display JVM version ======================================= cout << "JVM load succeeded: Version "; jint ver = env->GetVersion(); cout << ((ver>>16)&0x0f) << "."<<(ver&0x0f) << endl; jclass cls2 = env->FindClass("Main"); // try to find the class if (cls2 == nullptr) { cerr << "ERROR: class not found !"; } else { // if class found, continue cout << "Class MyTest found" << endl; jmethodID mid2 = env->GetStaticMethodID(cls2, "callRestPost2", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (mid2 == nullptr) { cerr << "ERROR: method it main2(int) not found !" << endl; } else { jstring jstr1 = env->NewStringUTF("http://traffic.c3po.mantis.com.tr"); jstring jstr2 = env->NewStringUTF(c); jstring jstr3 = env->NewStringUTF("measured_At"); jstring jstr4 = env->NewStringUTF("Zevkli_Sokak"); env->CallStaticVoidMethod(cls2, mid2, jstr1, jstr2, jstr3, jstr4); cout << endl; } } jvm->DestroyJavaVM(); cin.get(); } #包括 int main() { 使用名称空间std; JavaVM*jvm;//指向jvm的指针(Java虚拟机) JNIEnv*env;//指向本机接口的指针 //===========================准备加载Java虚拟机============================ JavaVMInitArgs vm_args;//初始化参数 JavaVMOption*options=newJavaVMOption[1];//JVM调用选项 选项[0]。选项字符串=“-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin”;//在哪里可以找到java.class vm_args.version=JNI_version_1_6;//最低Java版本 vm_args.nOptions=1;//选项数 vm_args.options=选项; vm_args.ignoreunrecogned=false;//无效选项会导致JVM初始化失败 //================加载并初始化Java VM和JNI接口============= jint rc=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);//是!! 删除选项;//这样我们就不再需要初始化选项了。 如果(rc!=JNI_OK){ //要执行的操作:错误处理。。。 cin.get(); 退出(退出失败); } //===================显示JVM版本======================================= coutgetversion(); cout>16)&0x0f),java,c++,spring,java-native-interface,Java,C++,Spring,Java Native Interface" />

在c+中加载.jar文件+;使用JNI 我需要将我的C++(OpenCV项目)与java代码(Web服务程序)集成,所以我使用JNI来集成它们。 我可以使用JNI从C++运行我的HeloWord java代码,如你在下面可以看到的: import java.io.IOException; public class Main { public Main() { System.out.println("hello from no arg"); } public static void main(String[] args) throws IOException { } private static void callRestPost2(String ontologyURI, String object, String predicate, String subject) throws IOException { java.util.Map<String, Object> params = new java.util.HashMap<String, Object>();//hedef params.put("operationType", "insertTriple4TrafficOntology"); params.put("ontologyURI", ontologyURI); params.put("object", object); params.put("predicate", predicate); params.put("subject", subject); System.out.println("Hello World!"); } } import java.io.IOException; 公共班机{ 公用干管(){ System.out.println(“来自无参数的你好”); } 公共静态void main(字符串[]args)引发IOException{ } 私有静态void callRestPost2(字符串ontologyURI、字符串对象、字符串谓词、字符串主题)引发IOException{ java.util.Map params=new java.util.HashMap();//hedef 参数put(“operationType”、“insertTriple4TrafficOntology”); 参数put(“本体论尤里”,本体论尤里); 参数put(“对象”,对象); 参数put(“谓词”,谓词); 参数put(“主体”,主体); System.out.println(“你好,世界!”); } } 但是我不能运行JavaRelax的Java代码,使用JNI从C++中运行,它在第二十五行上给出了一个错误(我猜想是因为Spring框架中的新对象[Spring Web-4.2.4..java版本)在第二十五行上创建的)。 import java.io.IOException; 导入org.springframework.http.HttpMethod; 导入org.springframework.http.ResponseEntity; 导入org.springframework.web.client.rest模板; 公共班机{ 公用干管(){ System.out.println(“来自无参数的你好”); } 公共静态void main(字符串[]args)引发IOException{ } 私有静态void callRestPost2(字符串ontologyURI、字符串对象、字符串谓词、字符串主题)引发IOException{ java.util.Map params=new java.util.HashMap();//hedef 参数put(“operationType”、“insertTriple4TrafficOntology”); 参数put(“本体论尤里”,本体论尤里); 参数put(“对象”,对象); 参数put(“谓词”,谓词); 参数put(“主体”,主体); ResponseEntity=null; RestTemplate RestTemplate=新RestTemplate(); 实体=restTemplate.exchange(“http://www.mantam.com.tr/c3po-rest-service/c3pont/insertTriple4TrafficOntology“+”?ontologyURI={ontologyURI}&subject={subject}&object={object}&predicate={predicate}”,HttpMethod.POST,null,String.class,params); System.out.println(entity.toString()); } } 因此,我的问题是“如何使用JNI在C++中加载jar文件”< /P> 我的C++代码: #include <jni.h> int main() { Using namespace std; JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) JNIEnv *env; // Pointer to native interface //================== prepare loading of Java VM ============================ JavaVMInitArgs vm_args; // Initialization arguments JavaVMOption* options = new JavaVMOption[1]; // JVM invocation options options[0].optionString = "-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin"; // where to find java .class vm_args.version = JNI_VERSION_1_6; // minimum Java version vm_args.nOptions = 1; // number of options vm_args.options = options; vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail //=============== load and initialize Java VM and JNI interface ============= jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !! delete options; // we then no longer need the initialisation options. if (rc != JNI_OK) { // TO DO: error processing... cin.get(); exit(EXIT_FAILURE); } //=============== Display JVM version ======================================= cout << "JVM load succeeded: Version "; jint ver = env->GetVersion(); cout << ((ver>>16)&0x0f) << "."<<(ver&0x0f) << endl; jclass cls2 = env->FindClass("Main"); // try to find the class if (cls2 == nullptr) { cerr << "ERROR: class not found !"; } else { // if class found, continue cout << "Class MyTest found" << endl; jmethodID mid2 = env->GetStaticMethodID(cls2, "callRestPost2", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (mid2 == nullptr) { cerr << "ERROR: method it main2(int) not found !" << endl; } else { jstring jstr1 = env->NewStringUTF("http://traffic.c3po.mantis.com.tr"); jstring jstr2 = env->NewStringUTF(c); jstring jstr3 = env->NewStringUTF("measured_At"); jstring jstr4 = env->NewStringUTF("Zevkli_Sokak"); env->CallStaticVoidMethod(cls2, mid2, jstr1, jstr2, jstr3, jstr4); cout << endl; } } jvm->DestroyJavaVM(); cin.get(); } #包括 int main() { 使用名称空间std; JavaVM*jvm;//指向jvm的指针(Java虚拟机) JNIEnv*env;//指向本机接口的指针 //===========================准备加载Java虚拟机============================ JavaVMInitArgs vm_args;//初始化参数 JavaVMOption*options=newJavaVMOption[1];//JVM调用选项 选项[0]。选项字符串=“-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin”;//在哪里可以找到java.class vm_args.version=JNI_version_1_6;//最低Java版本 vm_args.nOptions=1;//选项数 vm_args.options=选项; vm_args.ignoreunrecogned=false;//无效选项会导致JVM初始化失败 //================加载并初始化Java VM和JNI接口============= jint rc=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);//是!! 删除选项;//这样我们就不再需要初始化选项了。 如果(rc!=JNI_OK){ //要执行的操作:错误处理。。。 cin.get(); 退出(退出失败); } //===================显示JVM版本======================================= coutgetversion(); cout>16)&0x0f)

在c+中加载.jar文件+;使用JNI 我需要将我的C++(OpenCV项目)与java代码(Web服务程序)集成,所以我使用JNI来集成它们。 我可以使用JNI从C++运行我的HeloWord java代码,如你在下面可以看到的: import java.io.IOException; public class Main { public Main() { System.out.println("hello from no arg"); } public static void main(String[] args) throws IOException { } private static void callRestPost2(String ontologyURI, String object, String predicate, String subject) throws IOException { java.util.Map<String, Object> params = new java.util.HashMap<String, Object>();//hedef params.put("operationType", "insertTriple4TrafficOntology"); params.put("ontologyURI", ontologyURI); params.put("object", object); params.put("predicate", predicate); params.put("subject", subject); System.out.println("Hello World!"); } } import java.io.IOException; 公共班机{ 公用干管(){ System.out.println(“来自无参数的你好”); } 公共静态void main(字符串[]args)引发IOException{ } 私有静态void callRestPost2(字符串ontologyURI、字符串对象、字符串谓词、字符串主题)引发IOException{ java.util.Map params=new java.util.HashMap();//hedef 参数put(“operationType”、“insertTriple4TrafficOntology”); 参数put(“本体论尤里”,本体论尤里); 参数put(“对象”,对象); 参数put(“谓词”,谓词); 参数put(“主体”,主体); System.out.println(“你好,世界!”); } } 但是我不能运行JavaRelax的Java代码,使用JNI从C++中运行,它在第二十五行上给出了一个错误(我猜想是因为Spring框架中的新对象[Spring Web-4.2.4..java版本)在第二十五行上创建的)。 import java.io.IOException; 导入org.springframework.http.HttpMethod; 导入org.springframework.http.ResponseEntity; 导入org.springframework.web.client.rest模板; 公共班机{ 公用干管(){ System.out.println(“来自无参数的你好”); } 公共静态void main(字符串[]args)引发IOException{ } 私有静态void callRestPost2(字符串ontologyURI、字符串对象、字符串谓词、字符串主题)引发IOException{ java.util.Map params=new java.util.HashMap();//hedef 参数put(“operationType”、“insertTriple4TrafficOntology”); 参数put(“本体论尤里”,本体论尤里); 参数put(“对象”,对象); 参数put(“谓词”,谓词); 参数put(“主体”,主体); ResponseEntity=null; RestTemplate RestTemplate=新RestTemplate(); 实体=restTemplate.exchange(“http://www.mantam.com.tr/c3po-rest-service/c3pont/insertTriple4TrafficOntology“+”?ontologyURI={ontologyURI}&subject={subject}&object={object}&predicate={predicate}”,HttpMethod.POST,null,String.class,params); System.out.println(entity.toString()); } } 因此,我的问题是“如何使用JNI在C++中加载jar文件”< /P> 我的C++代码: #include <jni.h> int main() { Using namespace std; JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) JNIEnv *env; // Pointer to native interface //================== prepare loading of Java VM ============================ JavaVMInitArgs vm_args; // Initialization arguments JavaVMOption* options = new JavaVMOption[1]; // JVM invocation options options[0].optionString = "-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin"; // where to find java .class vm_args.version = JNI_VERSION_1_6; // minimum Java version vm_args.nOptions = 1; // number of options vm_args.options = options; vm_args.ignoreUnrecognized = false; // invalid options make the JVM init fail //=============== load and initialize Java VM and JNI interface ============= jint rc = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); // YES !! delete options; // we then no longer need the initialisation options. if (rc != JNI_OK) { // TO DO: error processing... cin.get(); exit(EXIT_FAILURE); } //=============== Display JVM version ======================================= cout << "JVM load succeeded: Version "; jint ver = env->GetVersion(); cout << ((ver>>16)&0x0f) << "."<<(ver&0x0f) << endl; jclass cls2 = env->FindClass("Main"); // try to find the class if (cls2 == nullptr) { cerr << "ERROR: class not found !"; } else { // if class found, continue cout << "Class MyTest found" << endl; jmethodID mid2 = env->GetStaticMethodID(cls2, "callRestPost2", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (mid2 == nullptr) { cerr << "ERROR: method it main2(int) not found !" << endl; } else { jstring jstr1 = env->NewStringUTF("http://traffic.c3po.mantis.com.tr"); jstring jstr2 = env->NewStringUTF(c); jstring jstr3 = env->NewStringUTF("measured_At"); jstring jstr4 = env->NewStringUTF("Zevkli_Sokak"); env->CallStaticVoidMethod(cls2, mid2, jstr1, jstr2, jstr3, jstr4); cout << endl; } } jvm->DestroyJavaVM(); cin.get(); } #包括 int main() { 使用名称空间std; JavaVM*jvm;//指向jvm的指针(Java虚拟机) JNIEnv*env;//指向本机接口的指针 //===========================准备加载Java虚拟机============================ JavaVMInitArgs vm_args;//初始化参数 JavaVMOption*options=newJavaVMOption[1];//JVM调用选项 选项[0]。选项字符串=“-Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin”;//在哪里可以找到java.class vm_args.version=JNI_version_1_6;//最低Java版本 vm_args.nOptions=1;//选项数 vm_args.options=选项; vm_args.ignoreunrecogned=false;//无效选项会导致JVM初始化失败 //================加载并初始化Java VM和JNI接口============= jint rc=JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);//是!! 删除选项;//这样我们就不再需要初始化选项了。 如果(rc!=JNI_OK){ //要执行的操作:错误处理。。。 cin.get(); 退出(退出失败); } //===================显示JVM版本======================================= coutgetversion(); cout>16)&0x0f),java,c++,spring,java-native-interface,Java,C++,Spring,Java Native Interface,我找到了解决方案,现在感到很高兴:) 您应该将完整路径添加到.jar文件中。例如: options = new JavaVMOption[1]; // JVM invocation options options[0].optionString = "Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\spring-web-4

我找到了解决方案,现在感到很高兴:)

您应该将完整路径添加到.jar文件中。例如:

options = new JavaVMOption[1];   // JVM invocation options
options[0].optionString =   "Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\spring-web-4.2.4.RELEASE.jar;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\spring-core-4.2.4.RELEASE.jar;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\spring-beans-4.2.4.RELEASE.jar;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\commons-logging-1.2.jar";   // where to find java .class and .jar files

就这样!!!

请不要发布代码图片。好的,谢谢你的警告,我编辑了我的问题。你需要添加你想加载到你的类路径中的jar档案。就像在命令行上一样。我如何添加?你能举个例子吗?Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin;spring-web-4.2.4.RELEASE.jar;spring core-4.2.4.RELEASE.jar;spring-beans-4.2.4.RELEASE.jar;commons-logging-1.2.jar”;但它不起作用:(
options = new JavaVMOption[1];   // JVM invocation options
options[0].optionString =   "Djava.class.path=C:\\Users\\proje\\workspace\\HelloWorld\\bin;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\spring-web-4.2.4.RELEASE.jar;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\spring-core-4.2.4.RELEASE.jar;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\spring-beans-4.2.4.RELEASE.jar;C:\\Users\\proje\\workspace\\HelloWorld\\bin\\commons-logging-1.2.jar";   // where to find java .class and .jar files