ниже метода и модульного теста для этого метода. Проблема в том, что я не могу вернуть значение результата из метода 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;
}
есть "свободный" метод, открытый с помощью собственного кода, но я не показывал, чтобы сосредоточиться на моей проблеме :-)
/ОБНОВИТЬ
благодарю!
О.
Просто решил...
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);
}
Проблема в том, что вы передаете 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);
}
}
LoadResults
(в моем примере) вызывающей стороне ...
ByteByReference[]
представляет собой массив указателей. Я сомневаюсь, что это то, что вы ищете.String
Java.