2013-02-12 2 views
0

Мне нужно вернуть массив значений структуры из C++ (jni) в java. У меня есть то структура C++ следующим образомНужно возвратить массив struct в c из jni в java (как массив объектов)

MyCStructure 
{ 

byte *Data; 
int dataLength; 
int width; 
int height; 
}mycstr; 

и у меня есть структура Java, как

public class MyJavaStructure 
{ 
    public byte[] Data; 
    public int dataLength; 
    public int width; 
    public int height; 
} 

И мой JavaMainClass.java является

MyJavaStructure[] mystr = MyJavaStructure[4]; 
public native int Process(); 
public LSImage getValues() 
{ 
    return this.mystr ; 
} 
public void setValues(MyJavaStructure bDetails) 
{ 
    this.mystr = bDetails; 
} 

Я попытался передать массив объектов (MyJavaStructure) непосредственно из JNI, используя GetMethodId из setValues.

Мой JNI код

JNIEXPORT jint JNICALL Java_TestJNI_Process(JNIEnv *jEnv, jobject jObj) 
{ 

    MyCStructure* mycstr = new MyCStructure[4]; 

    iRet = Process(&mycstr); 

    jclass jClass = jEnv->GetObjectClass(jObj); 
    jmethodID constructor; 


    jmethodID jObjectID = jEnv->GetMethodID (jLegendClass, "setValues", "(LMyCStructure;)V"); 
    if (jObjectID == NULL) 
    { 
     throwJavaException(jEnv, "Unable to find the method setValues"); 
     return NULL; 
    } 
    jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr); 

    printf ("After setting the output data value\n"); 

    jEnv->DeleteLocalRef(jClass); 

    return iRet; 
} 

Значение, возвращенное в mycstr содержит 4 массив структуры (MyCStructure) значений, и я попытался назначить в объект класса MyJavaStructure но он возвращается нуль.

Я делаю это правильно или я должен что-то изменить?

ответ

0
jEnv->CallObjectMethod(jObj, jObjectID, (jobject *) mycstr); 

Вы, очевидно, не можете этого сделать. mycstr не является jobject, ни указателем на jobject. jobject сам по себе является указателем на непрозрачную структуру, которая не должна вас заинтересовать, чтобы отделить вас от зависимости от конкретной реализации JNI.

Исходный код на C может понимать классы Java и объект благодаря множеству функций JNI, вызываемым из C. На стороне Java нет ничего, чтобы понять родные объекты. Итак, ответ - нет, вы не делаете это правильно.

Если вы хотите структуру (простой класс) синхронизированный между Java и родной, передать экземпляр класса, как jobject к родному вызова, а также использовать GetFieldID с последующим (например) Get/SetIntField.

+0

Если бы это была одна структура, я могу использовать Get/Set Fields. Мне нужно передать массив структуры. «Mycstr» содержит структуру с 4 значениями. – Narayan

+0

Ваш java-метод 'setValues ​​(MyJavaStructure bDetails)' принимает один экземпляр, а не массив, поэтому он не будет работать в любом случае. Итак, вам нужно обернуть массив в класс и иметь методы 'setDataLength (indexInArray, value)' и подобные, и вызвать их над JNI. На самом деле нет обхода, как напрямую передать объекты C на Java. –

+0

ok Я найду подходящий способ и отправлю его – Narayan

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