kunal
kunal

Reputation: 187

Unable to access certain classes from jar in C++ using JNI

I need to write a wrapper over the jar in C++. I did one POC and there i am able to find all the classes but in certain jars i am getting nullptr.

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

I am getting jclass object as nullptr.

Code snippet of KeycloakAdapterProperties class is as below.

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

Is it something relating to the creation of the JAR?

Please share your input on why i am getting nullptr?

Upvotes: 1

Views: 122

Answers (1)

kunal
kunal

Reputation: 187

==========Issue Details=================================

Issue: Unable to access certain classes from the keycloakadapterapi jar.

Root Cause: The class was not able to find it’s dependencies from other jar.

Solution: Whenever you call findClass() method of JNI for a specific class, ensure that you mentioned all the required jars while loading of JVM in C++.

e.g.

//==================== 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 !!

Note: I was mentioning a single jar(where my target class was written) while loading of Java VM.

Upvotes: 1

Related Questions