Java JNA结构的引用
下面是方法和该方法的单元测试。 问题是我无法从Load方法返回result的值。 下面的单元测试失败 我认为默认情况下JNA的对象是ByRef,所以我尝试在“不带”的情况下实例化和传递LoadResults 我的错在哪里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
@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[]
是指针数组。我怀疑这就是您要寻找的。如果您打算将字符串传递给函数,请使用Javastring
。问题不在于第一个参数(pathToFile)工作正常,而在于第二个参数(result)是一个输出参数。显示您的本机代码。如果“output param”是指struct**
而不是struct*
,则需要使用PointerByReference
,然后使用PointerByReference.getValue()
初始化一个新的结构。实际上,我的本机代码“返回”struct*
,在java端,我想返回该结构。好的,谢谢。严格地说,我的问题不在于JNA。与本机代码的交互工作得很好。我的问题是我无法将LoadResults
对象(在我的示例中)返回给调用者。。。