Структура JNA по ссылке

1

ниже метода и модульного теста для этого метода. Проблема в том, что я не могу вернуть значение результата из метода Load. ниже приведено детальное тестирование устройства!

Я думал, что по умолчанию объект JNA был ByRef по умолчанию, поэтому я попытался создать экземпляр и передать LoadResults "без".ByReference...

где моя ошибка?

@Test
public void testLoad () {
   MY_Processor proc = new MY_Processor();
   // LoadResults result = new LoadResults ();
   LoadResults.ByReference result = new LoadResults.ByReference();
   ByteByReference [] pathToFile = new ByteByReference[256];
   // fill pathToFile out ... 

   try {
      proc.Load (pathToFile, result);
      assertEquals(0, result.errorCode);
      assertEquals(1, result.elaborationTime);
      assertEquals(2, result.coreItem);
   } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }
}



public Integer Load ( ByteByReference[] pathToFile, 
                          LoadResults.ByReference result ) throws Exception {

   // here result is correctly filled out !
   LoadResults result = null;
   result = native.getResult (numCore);
}

добавлен собственный код.

ОБНОВИТЬ

// header
typedef struct
{
   int     errorCode;
   int     elaborationTime;
   int     coreItem;
} LoadResults;

//[in]  path
//[out] result
int Load (char path[MY_BUFFER_DEFINE], LoadResults* result);
// implementation ...

LoadResults* getResult (int numCore)
{
   // some check ... 

   LoadResults *localResult = new LoadResults();
   // fill out ... 

   return localResult;
}

есть "свободный" метод, открытый с помощью собственного кода, но я не показывал, чтобы сосредоточиться на моей проблеме :-)

/ОБНОВИТЬ

благодарю!

О.

  • 0
    ByteByReference[] представляет собой массив указателей. Я сомневаюсь, что это то, что вы ищете.
  • 0
    Если вы собираетесь передать строку в функцию, используйте String Java.
Показать ещё 3 комментария
Теги:
jna

2 ответа

0
Лучший ответ

Просто решил...

1) Мне не нужно использовать LoadResults.ByReference.

2) проблема заключалась в том, что в метод Load я обновил ссылку, переданную во входе, с другой:

public Integer Load ( ByteByReference[] pathToFile, LoadResults result ) throws Exception     
{
   // that the problem!!!! storing the value into another object with another "address"
   // and not the original "results".
   // result = native.getResult (numCore);

   // solved with this:
   native.getResult (numCore, result);
}
0

Проблема в том, что вы передаете Structure как параметр, а затем переназначаете этот параметр внутри функции. Это не повлияет на аргумент.

Шаблон, который вам нужно выполнить, следующий:

Pointer p = mylib.getResult()
MyStructure m = new MyStructure(p);
// ....
mylib.free(p);

Я бы рекомендовал вам передать родную строку (const char*) в качестве вашего пути, а не в буфер фиксированного размера собственного char.

ОБНОВИТЬ

Если вы хотите скопировать результат в аргумент, вам необходимо скопировать содержимое структуры, например

public int Load(LoadResults arg) throws Exception {
    // Effectively copy memory from result into arg
    LoadResults result = native.getResult(numCore);
    if (alternative_1) {
        // Copy result native memory into arg memory, then sync Java fields
        result.useMemory(arg.getPointer());
        result.write();
        arg.read();
    }
    else {
        // Sync result native memory with arg Java fields
        Pointer p = arg.getPointer();
        arg.useMemory(result.getPointer());
        arg.read();
        arg.useMemory(p);
    }
}
  • 0
    хорошо спасибо. Строго говоря, моя проблема не в JNA. Взаимодействие с нативным кодом работает просто отлично. Моя проблема в том, что я не могу вернуть объект LoadResults (в моем примере) вызывающей стороне ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню