0 Replies Latest reply on Oct 22, 2018 6:11 AM by gjijut

    C++ JNI 1_8 - Difficulty executing jar (missing class loads)

    gjijut

      I have a jar that I can execute normally using java.exe Trying to execute this jar from a JNI-using C++ project I hit error after error.

       

      Configuration:

      WIndows 8
      Visual Studio 2017
      Netbeans 8.2
      JRE/JDK: jdk1.8.0_102
      JVM dll path: C:/Program Files/Java/jdk1.8.0_102/jre/bin/server/jvm.dll
      
      options:
      -Djava.compiler=NONE
      -Djava.library.path=../lib
      -Djava.class.path=.;../lib/sqljdbc4.jar;../lib/activation.jar;../lib/mail.jar;../lib/xerces.jar
      -verbose
      -XX:+TraceClassLoading

       

      In the C project I load the java project as a binary stream, then loop each class entry and use DefineClass( name, null, bytes, size ), five classes fail.

       

      Upon retryng the five, four pass ( so, dependency problem ), one class never passes.

       

      failing class:

       

      import javax.mail.Authenticator;
      import javax.mail.PasswordAuthentication;
      
      public class MyAuthenticator extends Authenticator
      {
          String username;
          String password;
          public MyAuthenticator( String u , String p )
          {
              this.username = u;
              this.password = p;
          }
          @Override
          public PasswordAuthentication getPasswordAuthentication()
          {
              return new PasswordAuthentication( username, password );
          }
      }
      

       

      If I use FindClass in the C project for Authenticator and PasswordAuthentication, they pass. Java project still get class not found.

       

      If I use class for name in the java project it fails, it passes if I also send the system class loader (default loader is null), but the java project still cant find the class once it gets to the code that calls new.

       

      I also have five custom threads started on the main of the java project, they also complain about class not found (for every thread) eg for Thread1 extends Thread, if I do new Thread1() and Thread1.run() it will not be able to. These Thread classes pass the DefineClass loop so they should exist on the jvm.

       

      Im gtting frustrated, but what am I doing wrong? or is JNI too simple to do this?