2017-11-06 2 views
1

C++のjarにラッパーを記述する必要があります。私は1つのPOCを行い、すべてのクラスを見つけることができましたが、特定のjarではnullptrを取得しています。JNIを使​​用してC++のjarから特定のクラスにアクセスできません

jclass keyCloakTestClass = env- 
>FindClass("com/test/main/KeycloakAdapterProperties"); 
if(keyCloakTestClass == nullptr) 
    { 
     cerr << "ERROR: class not found !"; 
    } 

nullptrとしてjclassオブジェクトが取得されています。

KeycloakAdapterPropertiesクラスのコードスニペットは次のとおりです。

package com.test.main; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.net.URLClassLoader; 
    import java.util.Properties; 

    public final class KeycloakAdapterProperties 
    { 
     private KeycloakAdapterProperties() 
      { 
       throw new InstantiationError("no instance creation allowed"); 
      } 
    } 

これはJARの作成に関係するものですか?

nullptrを取得している理由を入力してください。

+1

クラスcom/siemens/vicos/cbtc/main/KeyCloakTestを探していますが、実際にはあなたのクラスはcom/test/main/KeycloakAdapterProperties – mko

+0

です。投稿を編集しました。編集したコードスニペットで入力内容を共有してください。 – kunal

答えて

1

========== 問題の詳細 ================================ =

問題: keycloakadapterapi jarから特定のクラスにアクセスできません。

根本原因:クラスは他のjarから依存関係を見つけることができませんでした。

ソリューション:特定のクラスに対してJNIのfindClass()メソッドを呼び出すときは、C++でJVMをロードする際に必要なすべてのjarを記述していることを確認してください。

//==================== prepare loading of Java VM ============================ 
JavaVMInitArgs vm_args;      // Initialization arguments 
JavaVMOption* options = new JavaVMOption[3]; // JVM invocation options 
options[0].optionString = "-Djava.class.path=D:\\UserManagment\\KeycloakAdapterWrapper\\ocskeycloakadapterapi-3.1.0.6.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\log4j-api-2.7.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\log4j-core-2.7.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\log4j-iostreams-2.7.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\bcpkix-jdk15on-1.52.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\bcprov-jdk15on-1.52.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\commons-codec-1.9.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\commons-lang3-3.6.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\commons-logging-1.2.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\httpclient-4.5.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\httpcore-4.4.1.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jackson-annotations-2.5.0.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jackson-core-2.5.4.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jackson-databind-2.5.4.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jboss-logging-3.3.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\jsoup-1.10.3.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-adapter-core-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-adapter-spi-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloakAdapterWrapper.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-common-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-core-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\keycloak-installed-adapter-3.1.0.Final.jar;D:\\UserManagment\\KeycloakAdapterWrapper\\spcommon-0.0.0.2-SNAPSHOT.jar"; // where to find java .class 
vm_args.version = JNI_VERSION_1_8; // 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 !! 

注:私は、Java VMのロード中に(私のターゲットクラスが書かれた)単一のjarを言及しました。

関連する問題