2017-02-18 26 views
2

У меня есть метод java, который вызывается из моего собственного метода и возвращает массив объектов в собственный код.Как получить доступ к элементам из jobjectarray в jni

Элементы массива объектов устанавливаются как,

Object[] arr = new Object[10]; 
    arr[0] = new Integer(12); 
    arr[1] = new Float(25.5f); 

Я получаю этот массив в моем родном коде следующим образом,

jobjectArray a = (jobjectArray)(*env)->CallStaticObjectMethodA(env, <class_id>, <method_id>, <parameter_list>); 

У меня есть тип данных каждого элемента, хранящегося в массив объектов. Поэтому, основываясь на типе данных, как я могу получить доступ к соответствующему значению integer и float в моем собственном методе.

Я попытался следующие,

jobject obj = (*env)->GetObjectArrayElement(env, a, 0); 
    int num = (jint)obj; 

Но значение, которое устанавливается на пит неверен.

ответ

0

Java делает auto-unboxing при преобразовании Integer в int. Но этот механик не существует в C. Что вы делаете, это взять адрес памяти элемента и интерпретировать его как int.

Если вы хотите получить int от Integer на C стороне, вы должны позвонить intValue:

jobject objInteger = (*env)->GetObjectArrayElement(env, a, 0);  

jclass cInteger = (*env)->FindClass(env, "java/lang/Integer"); 
jmethodID intValue = (*env)->GetMethodID(env, cInteger, "intValue", "()I"); 
int i = (*env)->CallIntMethod(env, objInteger, intValue); 
+0

Спасибо большое. Это сработало. – keerthana