Set / Get Java List <> del código C
Código Java
En código Java tengo clase llamada IdentificationResult
que tiene 3 miembros:
-
enrollmentID
-
enrollmentSettings
-
identParams
.
Aquí está la clase:
- JNI de Android no encuentra archivos de encabezado de biblioteca estándar de C ++
- Filtrado de MatOfDMatch
- Uso de javah en linux
- JNI manteniendo una referencia global a un objeto, accediendo a ella con otros métodos JNI. Mantener un objeto C ++ activo en varias llamadas JNI
- Configuraciones de firma de Android y conflicto con splits abi
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
-
¿Qué debo escribir aquí para obtener el ID de campo de
List<IdentParams>
? -
¿Cómo puedo obtener o establecer el valor de campo?
- Cómo construir una biblioteca compartida y llamarla en otro programa ndk
- Pasar descriptor de archivo USB al programa Android NDK
- Cómo especificar el archivo de encabezado c en el archivo android.mk
- Ciclo de vida de actividad de Android y ciclo de código nativo de JNI
- Android NDK, ninguna regla para hacer objetivo
- Android OpenGL ES: auto-corrección env-> self y NvRmChannelSubmit fallaron
- ¿Cómo obtener los mensajes "printf" escritos en la aplicación NDK?
- UnsatisfiedLinkError: Método nativo no encontrado - Android
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.
- TabLayout falta después de actualizar la biblioteca de soporte de diseño
- Cómo activar la Wi-Fi en el dispositivo de emulador de Android?