Advertisement
Guest User

MWEJavaInterface

a guest
May 29th, 2015
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.99 KB | None | 0 0
  1. #include <jni.h>
  2.  
  3. #include <string>
  4. #include <cassert>
  5. #include <iostream>
  6.  
  7. #include <stdexcept>
  8.  
  9. class MWEJavaInterface
  10. {
  11.     private:
  12.         std::string MWE_str;
  13.  
  14.         // Java context
  15.         JNIEnv*     JNIEnvironment;
  16.         JavaVM*     javaVM;
  17.  
  18.         std::string javaClassPath;
  19.         std::string javaClassName;
  20.  
  21.         // Java class
  22.         jclass      javaClass;
  23.  
  24.         // Java object (class instance)
  25.         jobject     javaClassInstance;
  26.  
  27.         // Java methods
  28.         jmethodID   IDconstructor;      // ()V
  29.         jmethodID   IDsetString;        // (Ljava/lang/String;)V
  30.         jmethodID   IDgetString;        // ()Ljava/lang/String;
  31.  
  32.     public:
  33.         MWEJavaInterface();
  34.  
  35.         void init_context( void);               //Init methods
  36.         void init_class( void);
  37.         void init_methods( void);
  38.  
  39.         void j_constructor( void);
  40.         void j_setString( std::string);
  41.         std::string j_getString( void);
  42.  
  43. };
  44. MWEJavaInterface::MWEJavaInterface()
  45. {
  46.     this->javaClassPath  = "/home/user/Documents/MWE"; //CHANGE HERE
  47.     this->javaClassName  = "EXICodec";
  48.  
  49.     this->javaClass      = NULL;
  50.     this->javaClassInstance = NULL;
  51.  
  52.     this->IDconstructor      = NULL;
  53.     this->IDsetString        = NULL;
  54.     this->IDgetString        = NULL;
  55. }
  56.  
  57. void MWEJavaInterface::init_context()
  58. {
  59.     const std::string optionString("-Djava.class.path="+this->javaClassPath);
  60.  
  61.     JavaVMOption options[3] = {
  62.         { const_cast<char*>("-Xmx128m"), NULL },
  63.         { const_cast<char*>("-verbose:gc"), NULL },
  64.         { const_cast<char*>(optionString.c_str()), NULL }
  65.     };
  66.  
  67.     JavaVMInitArgs vm_args;
  68.     vm_args.version = JNI_VERSION_1_6;
  69.     vm_args.options = options;
  70.     vm_args.nOptions = sizeof(options) / sizeof(JavaVMOption);
  71.     assert(vm_args.nOptions == 3);
  72.  
  73.     this->JNIEnvironment = NULL;
  74.     this->javaVM = NULL;
  75.  
  76.     int res = JNI_CreateJavaVM(&this->javaVM
  77.                                , reinterpret_cast<void**>(&this->JNIEnvironment)
  78.                                , &vm_args);
  79.  
  80.     if (JNI_OK != res)
  81.     {
  82.         throw std::runtime_error("JAVA_VM_EXCEPTION");
  83.     }
  84. }
  85.  
  86. void MWEJavaInterface::init_class()
  87. {
  88.     this->javaClass = this->JNIEnvironment
  89.                           ->FindClass(std::string(this->javaClassName).c_str());
  90.  
  91.     if (NULL == this->javaClass)
  92.     {
  93.         throw std::runtime_error("JAVA_CLASS_EXCEPTION");
  94.     }
  95. }
  96.  
  97. void MWEJavaInterface::init_methods()
  98. {
  99.     this->IDconstructor = this->JNIEnvironment->GetMethodID(this->javaClass
  100.                                                             , "<init>"
  101.                                                             , "()V");
  102.  
  103.     this->IDsetString = this->JNIEnvironment
  104.                             ->GetMethodID(this->javaClass
  105.                                           , "setInputXML"
  106.                                           , "(Ljava/lang/String;)V");
  107.  
  108.     this->IDgetString = this->JNIEnvironment
  109.                             ->GetMethodID(this->javaClass
  110.                                           , "getInputXML"
  111.                                           , "()Ljava/lang/String;");
  112. }
  113.  
  114. void MWEJavaInterface::j_constructor()
  115. {
  116.     this->javaClassInstance = this->JNIEnvironment
  117.                                   ->NewObject(this->javaClass
  118.                                               , this->IDconstructor);
  119.  
  120.     if (NULL == this->javaClassInstance)
  121.     {
  122.         throw std::runtime_error("JAVA_CONSTRUCTOR_EXCEPTION");
  123.     }
  124. }
  125.  
  126. void MWEJavaInterface::j_setString( std::string str)
  127. {
  128.     jstring argument = this->JNIEnvironment->NewStringUTF(str.c_str());
  129.  
  130.     this->JNIEnvironment->CallVoidMethod(this->javaClassInstance
  131.                                          , this->IDsetString
  132.                                          , argument);
  133. }
  134.  
  135. std::string MWEJavaInterface::j_getString()
  136. {
  137.  
  138.     jstring javaString
  139.         = (jstring) this->JNIEnvironment
  140.                         ->CallObjectMethod(this->javaClassInstance
  141.                                            , this->IDgetString
  142.                                            , 0);
  143.  
  144.     if (NULL == javaString)
  145.     {
  146.         throw std::runtime_error("JAVA_RETURN_EXCEPTION");
  147.     }
  148.  
  149.     // jString to char*
  150.     const char *nativeString = this->JNIEnvironment
  151.                                    ->GetStringUTFChars(javaString, JNI_FALSE);
  152.  
  153.     std::string str(nativeString);
  154.  
  155.     this->JNIEnvironment->ReleaseStringUTFChars(javaString, nativeString);
  156.  
  157.     return str;
  158. }
  159.  
  160. int main()
  161. {
  162.     MWEJavaInterface *jInterface = new MWEJavaInterface();
  163.  
  164.     jInterface->init_context();
  165.     jInterface->init_class();
  166.     jInterface->init_methods();
  167.     jInterface->j_constructor();
  168.  
  169.     std::string test_str = jInterface->j_getString();
  170.     std::cout << test_str << std::endl;
  171.     std::cout << "everything runs great until now" << std::endl;
  172.  
  173.     jInterface->j_setString("test");
  174.     test_str = jInterface->j_getString();
  175.     std::cout << test_str << std::endl;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement