Java JNA结构的引用

Java JNA结构的引用,java,jna,Java,Jna,下面是方法和该方法的单元测试。 问题是我无法从Load方法返回result的值。 下面的单元测试失败 我认为默认情况下JNA的对象是ByRef,所以我尝试在“不带”的情况下实例化和传递LoadResults 我的错在哪里 @Test public void testLoad () { MY_Processor proc = new MY_Processor(); // LoadResults result = new LoadResults (); LoadResults.By

下面是方法和该方法的单元测试。 问题是我无法从Load方法返回result的值。 下面的单元测试失败

我认为默认情况下JNA的对象是ByRef,所以我尝试在“不带”的情况下实例化和传递LoadResults

我的错在哪里

@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);
}
添加了本机代码

更新

//头
类型定义结构
{
国际误码;
详细阐述时间;
int核心项目;
}加载结果;
//[in]路径
//[输出]结果
int Load(字符路径[MY\u BUFFER\u DEFINE],LoadResults*result);
//实现。。。
LoadResults*getResult(int numCore)
{
//一些支票。。。
LoadResults*localResult=新的LoadResults();
//填写。。。
返回本地结果;
}
本机代码公开了一个“free”方法,但为了集中精力解决问题,我没有显示该方法:-)

/UPDATE

谢谢


O.

问题在于,您将
结构作为参数传递,然后在函数中重新分配该参数。这对争论没有任何影响

您需要遵循的模式是:

指针p=mylib.getResult()
MyStructure m=新的MyStructure(p);
// ....
游离mylib(p);
我建议您传入一个本机字符串(
const char*
)作为路径,而不是一个固定大小的本机
char
缓冲区

更新

如果要将结果复制到参数中,则需要复制结构的内容,例如

public int Load(LoadResults arg)引发异常{
//有效地将内存从结果复制到arg
LoadResults=native.getResult(numCore);
如果(备选方案1){
//将结果的本机内存复制到arg的内存中,然后同步Java字段
使用内存(arg.getPointer());
result.write();
arg.read();
}
否则{
//将结果的本机内存与arg的Java字段同步
指针p=arg.getPointer();
arg.useMemory(result.getPointer());
arg.read();
参数使用记忆(p);
}
}
刚刚解决

1) 我不需要使用
LoadResults.ByReference

2) 问题在于,在Load方法中,我用另一个更新了传入输入的引用:

public Integer Load ( ByteByReference[] pathToFile, LoadResults result ) throws Exception     
{
   // that's 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);
}

ByteByReference[]
是指针数组。我怀疑这就是您要寻找的。如果您打算将字符串传递给函数,请使用Java
string
。问题不在于第一个参数(pathToFile)工作正常,而在于第二个参数(result)是一个输出参数。显示您的本机代码。如果“output param”是指
struct**
而不是
struct*
,则需要使用
PointerByReference
,然后使用
PointerByReference.getValue()
初始化一个新的
结构。实际上,我的本机代码“返回”
struct*
,在java端,我想返回该结构。好的,谢谢。严格地说,我的问题不在于JNA。与本机代码的交互工作得很好。我的问题是我无法将
LoadResults
对象(在我的示例中)返回给调用者。。。