Как мне использовать SetArrayRegion для сопоставления массива из структуры C в массив классов Java? - PullRequest
0 голосов
/ 25 сентября 2011

Я хочу получить доступ к членам данных структуры C (ниже) и отобразить их в массив в моем классе Java.Я пытался использовать Set <> ArrayRegion для сопоставления значений, но я где-то идет не так.Ниже приведен пример того, что я пытаюсь сделать.Может кто-нибудь помочь мне с правильным синтаксисом для сопоставления значений?

c заголовок

`

typedef struct a {
    long                            nls;
    uint8_t                         *lane; 
    long                            t; 

} aa;

typedef struct b {
    uint32_t                        id; 
    uint64_t                        timestamp_ms;
    long                            num_states;
    aa                      *move_states; 
} bb;

класс java

class J {
    int     i_id; 
    long        timestamp_ms; 
    long        num_states;
    long[]      nls;
    long[][]    lane;
    long[]      t;      

    }

test.c

JNIEXPORT jint JNICALL Java_com_android_...
  (JNIEnv *env, jclass c, jobject obj)
{


    bb  c_struct;

    // do some operations on c_struct to populate the structure

    ....


    J   java_class;
    jFieldID fid;
    jclass cls = (*env)->GetObjectClass(env,obj);


    fid=(*env)->GetFieldID(env,cls,"i_id","I");
    (*env)->SetIntField(env,obj,fid,c_struct.id);

    ... similar for timestamp_ms,num_states


    // how do I map c_struct->move_states[i].nls to java_class.nls[i] ??
    // also how do I map c_struct->move_states[i].lane[j] to java_class.lane[i][j]?? 


}`

1 Ответ

0 голосов
/ 28 сентября 2011

Возможно, вам нужно выделить массив для начала.

Это означает создание объекта массива с достаточной длиной NewLongArray (), использование SetLongArrayRegion () для заполнения объекта массива, а затем использование SetObjectField () для установкиновый экземпляр массива в java-объект (исключая старый).

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

int SIZE = 1000;  // make this big enough
J j = new J();
j.nls = new long[SIZE];
j.lane = new long[SIZE][SIZE];  // something like this multi-dimention array
j.t = new long[SIZE];
int i = callMyJniMethod(j);

Теперь попробуйте свои идеи GetField, SetLongArrayRegion.Убедившись, что num_states <1000. </p>

Как только вы докажете, что это начинает работать, вы можете работать над тем, как именно вы хотите, чтобы ваш API работал.Идеи по этому поводу:

  • Сохраните текущий дизайн, но JNI выделит массив.

  • Создайте новый объект Java "AA" иJNI устанавливает один для каждого C ++ «aa» и заполняет его, а затем присоединяет массив BB (aka J) к объекту J.j.aa = новый AA [num_states];

FWIW вы пытаетесь скопировать данные между C ++ / Java (не картой, так как использование карты терминов подразумевает некоторый обмен, обновлениеодин не будет обновлять другой, если вы не скопируете его заново)

FWIW "long" в C / C ++, возможно, 32-битный на вашей платформе, но "long" в Java всегда 64-битный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...