0
我需要將我的C++(OpenCV項目)與Java代碼(一個web服務程序)集成,所以我使用JNI來整合它們。使用JNI在C++中加載.jar文件
我可以通過使用JNI運行從C++我helloWorld的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!");
}
}
但我不能運行,這具有的.jar的依賴,從C++使用我的Java代碼JNI,它在第25行提供了一個錯誤(我猜是因爲Spring框架的新對象[spring-web-4.2.4.RELEASE.jar])創建於第25行)。
import java.io.IOException;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
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);
ResponseEntity<String> entity = null;
RestTemplate restTemplate = new RestTemplate();
entity = 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文件?」
我的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();
}
請不要張貼圖片的代碼。 –
好的,感謝您的警告,我編輯了我的問題。 – Ozlu
您需要將要加載的jar檔案添加到您的課程路徑中。就像在命令行上一樣。 – mkaes