Set / Get Java List <> del código C

Código Java

En código Java tengo clase llamada IdentificationResult que tiene 3 miembros:

  1. enrollmentID
  2. enrollmentSettings
  3. identParams .

Aquí está la clase:

 package com.vito.android.framework.service; class IdentificationResult { class IdentParams { byte[] otp; String seedId; } String enrollmentID; String enrollmentSettings; List<IdentParams> identParams; } 

En la clase principal tengo la función IdentificationResult GetAuthenticationStatus( ) , aquí está la clase principal:

 public class TokenManager { /* Some code goes here ... */ public IdentificationResult GetAuthenticationStatus( ) { /* Function do some actions here ... */ return new IdentificationResult; } } 

Código C ++

Llamo a método Java desde mi código C ++ de esta manera

 void GetAuthenticationStatus( ) { // Attach current thread. JNIEnv *env = NULL; m_javaVM->AttachCurrentThread( env, NULL ); if( env == NULL ) { return -1; } jclass clazz = NULL; clazz = env->GetObjectClass( m_classObject ); if( clazz == NULL ) { return -1; } // Get class method. jmethodID clazzMethod = NULL; env->GetMethodID( clazz, "GetAuthenticationStatus", "(V;)Lcom/vito/android/framework/service/IdentificationResult;" ); if( clazzMethod == NULL ) { return VCS_RESULT_ERROR; } // Call Java 'GetAuthenticationStatus' function. jobject methodReturnObj = env->CallObjectMethod( m_classObject, clazzMethod ); // Get IdentificationResult Class from Object. jclass identifyResultClass = env->GetObjectClass( methodReturnObj ); if( identifyResultClass == NULL ) { return -1; } // Get identParams. jfieldID fieldID = env->GetFieldID( identifyResultClass , "identParams", "***1. Question***"); if( fieldID == NULL ) { return -1; } else { *** 2. Question *** } } 

Preguntas

  1. ¿Qué debo escribir aquí para obtener el ID de campo de List<IdentParams> ?

  2. ¿Cómo puedo obtener o establecer el valor de campo?

Bueno, tengo resolver el problema y quiero compartir el resultado con usted, aquí está la solución:

  fieldID = env->GetFieldID( identifyResultClass , "identParams", "Ljava/util/List;" ); if( fieldID != NULL ) { // Find "java/util/List" Class (Standard JAVA Class). jclass listClass = env->FindClass( "java/util/List" ); if( listClass == NULL ) { DBG_WARNING(DBG_CTX, ("Can't Find Class \"java/util/List\".\n")); return -1; } // Get List object field. jobject listObject = env->GetObjectField( methodReturnObj, fieldID ); if( listObject == NULL ) { DBG_WARNING(DBG_CTX, ("Can't get ObjectField for \"List\".\n")); return -1; } // Get "java.util.List.get(int location)" MethodID jmethodID getMethodID = env->GetMethodID( listClass, "get", "(I)Ljava/lang/Object;" ); if( getMethodID == NULL ) { DBG_WARNING(DBG_CTX, ("Can't get MethodID for \"java.util.List.get(int location)\".\n")); return -1; } // Get "int java.util.List.size()" MethodID jmethodID sizeMethodID = env->GetMethodID( listClass, "size", "()I" ); if( sizeMethodID == NULL ) { DBG_WARNING(DBG_CTX, ("Can't get MethodID for \"int java.util.List.size()\".\n")); return -1; } // Call "int java.util.List.size()" method and get count of items in the list. int listItemsCount = (int)env->CallIntMethod( listObject, sizeMethodID ); DBG_DISPLAY(DBG_CTX,("List has %i items\n", listItemsCount)); for( int i=0; i<listItemsCount; ++i ) { // Call "java.util.List.get" method and get IdentParams object by index. jobject identParamsObject = env->CallObjectMethod( listObject, getMethodID, i - 1 ); if( identParamsObject == NULL ) { DBG_WARNING(DBG_CTX, ("Can't get Object from \"identParamsObject\" at index %i.\n", i - 1)); } } 

Gracias a @Joop Eggen me da una gran idea !!!

No considere lo siguiente compilable, pero obtendrá la idea:

 jobject list = env->GetObjectField(methodReturnObj, "identParams"); // java.util.List getMID = env->GetMethodID (listClass, "get","(I)Object"); jobject someIdentParam = env->CallMethod(getMid, new Object[] { list, 0 }); // java.lang.Object 

Lea primero la documentación.

  • Compilación de Android JNI para OpenCV en Mac OSX
  • ¿Las funciones de Android JNI se ejecutan en el hilo principal?
  • JNA para android
  • Error durante la compilación de la muestra de jni de android: inválido -march = opción: `armv5te '
  • Un proyecto ndk simple usando la biblioteca de Eigen y jni
  • No se puede obtener el valor JNIEnv * en contexto arbitrario
  • Cómo utilizar la API de malla experimental con Project Tango
  • Decodificación y manipulación de imágenes mediante JNI en android
  • Depuración del código Android NDK C / C ++ en Eclipse: los puntos de interrupción no se alcanzan
  • Embalaje RAW AAC en el contenedor m4a?
  • UnsatisfiedLinkError en el método nativo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.