2016-12-01 14 views
0

私はC++(OpenCVプロジェクト)をJavaコード(Webサービスプログラム)と統合して、JNIを統合する必要があります。JNIを使​​用してC++で.jarファイルをロード

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!"); 
    } 
} 

をしかし、私は使用してC++から、.jarファイルの依存関係を持っている私のJavaコードを実行することはできません。

私はあなたが以下に見ることができるようにJNIを使​​用してC++からの私のHelloWorldの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(); 
} 
+0

コードの画像を投稿しないでください。 –

+0

警告のためにありがとう、私は私の質問を編集しました。 – Ozlu

+1

クラスパスにロードするjarアーカイブを追加する必要があります。コマンドラインのように。 – mkaes

答えて

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 

これはそれです!

関連する問題