2015-11-09 4 views
1

Я создаю простую C++-оболочку через Java JNI для доступа к моему Java-коду. Мой вопрос в том, что я перечисляю в своем Java-коде, что мне нужно получить значение из моего кода JNI на C++. Каков наилучший способ сделать это?Как получить Java Enum из C++ JNI?

Вот мой снимок моего Java-код:

package mypackage; 

    public class ClassFooJava 
    { 
     public enum MyEnum 
     { 
      Enabled (0), 
      DoNothing (1), 
      Disable (2) 
      ; 

      public int getValue() 
      { 
       return valueEnum; 
      } 

      private final int valueEnum; 

      private MyEnum(int valueEnum) 
      { 
       this.valueEnum = valueEnum; 
      } 
     } 

     static 
     { 
      try 
      { 
       System.load("MyCPlusPlus.dll"); 
      } 
      catch(Exception e) 
      { 
       System.err.println("Caught exception: " + e.toString()); 

      }  
     } 
     public native long GetInstance(); 
     public native void FreeInstance(long LearningAccess); 
     public native int FooFunctionJava(MyEnum myEnum); 
    } 

А вот мой снимок моей C++ код:

JNIEXPORT jint JNICALL Java_com_cummins_ctp_ClassFooJava 
    (JNIEnv * env, jobject obj, 
      jobject j_myEnum) 
{ 
    jclass cls = env->GetObjectClass(obj); 

    jfieldID myEnumField = env->GetFieldID(cls, "MyEnum", "Lmypackage.ClassFooJava;"); 

    if (myEnumField == NULL) 
    { 
     // IT ALWAYS NULL 
     cout << "NULL NULL NULL" << endl; 
     return 0; 
    } 
} 

Обратите внимание, что в моем коде C++, то enumField всегда нуль. Что не так с моим кодом? Является ли мой код правильным, чтобы получить поле перечисления внутри объекта? Должен ли я создать перечисление вне класса ClassFooJava? Я действительно ценю любую помощь.

+0

'MyEnum' - тип перечисления, а не поле. Поле было бы, если бы у вас было что-то вроде 'private MyEnum myEnum;' – Michael

ответ

0

Что не так с моим кодом?

Java_com_cummins_ctp_ClassFooJava 

Имя функции вы реализующая отсутствуют.

Является ли мой код правильной вещью, чтобы получить поле перечисления внутри объекта?

Вы передаете сообщение MyEnum в качестве аргумента. Это j_myEnum. Может быть, вы хотели valueEnum

jfieldID valueEnumField = 
        env->GetFieldID(cls, "valueEnum", "Lmypackage/ClassFooJava$MyEnum;"); 

Должен ли я создать перечисление вне моего класса ClassFooJava?

Это зависит от вас.

+1

Hi Peter, я не мог заставить его работать. Вероятно, эта строка все еще не верна: env-> GetFieldID (cls, "valueEnum", "Lmypackage/ClassFooJava $ MyEnum; "); Но в любом случае, это работает, если я перечислил перечисление вне моей ClassFooJava. Поэтому я рассматриваю перечисление как отдельный «класс» в моем коде JNI C++. И это работает. – nsutanto

Смежные вопросы