[英]Unknown Source Error in JNA ( Return Struct Array function in C)
我尝试制作JNA应用程序。 但是,我不能从C获取sturct数组。我在Java端遇到错误( com.sun.Proxy。$ Proxy0.fill(Unknown Source) )
这是我下面的c代码的一部分。 我编译为共享库,并且可以使用其他功能。 调用fill函数时仅给出错误。
typedef struct A{
double Value;
char Type;
char Name[100];
char SymbolTableName[100];
int updateMode;
int dataType;
char ulSize;
} A;
typedef struct B{
int numAs;
struct A* as;
} B;
B fill(void){
B sVal;
sVal.numAs=100;
int i=0;
sVal.as = (A*)malloc(sizeof(A) * sVal.numAs);
memset(sVal.as, 0, sizeof(A) * sVal.numAs);
//X in scope , everything is ok here.
X= ReadShared(); // It return struct array , X is struct same type.
for(i=0; i<sVal.numAs; i++)
{
sVal.as[i].Value=X->datas[i].Value;
sVal.as[i].Type=X->datas[i].Type;
strcpy(sVal.as[i].Name,X->datas[i].Name);
strcpy(sVal.as[i].SymbolTableName,X->datas[i].SymbolTableName);
sVal.as[i].updateMode=X->datas[i].updateMode;
sVal.as[i].dataType=X->datas[i].dataType;
sVal.as[i].ulSize=X->datas[i].ulSize;
}
return sVal;
}
这是我下面的Java部分。
public class TestClass {
public interface Test extends Library {
public static class A extends Structure {
public static class ByReference extends A implements Structure.ByReference{}
double Value;
char Type;
char Name;
char SymbolTableName;
int updateMode;
int dataType;
char ulSize;
protected List getFieldOrder() {
// TODO Auto-generated method stub
return null;
}
}
public static class B extends Structure {
public static class ByValue extends B implements Structure.ByValue {}
public int numAs;
public A.ByReference as;
protected List getFieldOrder() {
// TODO Auto-generated method stub
return null;
}
}
public B.ByValue fill();
}
/**
* @param args
*/
public TestClass(){
}
static void funcc(){
NativeLibrary.addSearchPath("tester", "/root/Desktop/");//Path is true
Test test=(Test)Native.loadLibrary("tester", Test.class);
Test.B.ByValue jig=test.fill();
Test.A[] Avals = (Test.A[])jig.as.toArray(jig.numAs);
}
}
我将如何纠正此错误? 为什么会发生? 也许有一些缺少我看不到的东西(Java端或c端)。 感谢您的帮助。
在com.sun.jna.Structure.getFields(Structure.java:911)在com.sun.jna.Structure.deriveLayout(Structure.java:1058)在com.sun.jna.Structure.calculateSize(Structure.java:982) )在com.sun.jna.Structure。(Structure.java:184)的com.sun.jna.Structure.allocateMemory(Structure.java:375)的com.sun.jna.Structure.calculateSize(Structure.java:949) )在com.sun.jna.Structure。(Structure.java:172)在com.sun.jna.Structure。(Structure.java:159)在com.sun.jna.Structure。(Structure.java:151)在位于MyTest.TestClass $ Test $ B $ B $ ByValue。(TestClass.java:39)处的MyTest.TestClass $ Test $ B。(TestClass.java:39)位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)位于sun.reflect。 java.lang.Class.newInstance上java.lang.reflect.Constructor.newInstance(Constructor.java:526)上的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)上的NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) (Class.java:379)在com.sun.jna.Structure.newInstanc e(Structure.java:1651)位于com.sun.jna.Function.invoke(Function.java:408)位于com.sun.jna.Function.invoke(Function.java:315)位于com.sun.jna.Library位于com.sun.proxy的 $ Handler.invoke(Library.java:212) 。位于MyTest.t7500.doGet(t7500.java )的MyTest.TestClass.funcc(TestClass.java:63)的$ Proxy0.fill(未知源) : 51)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain)在javax.servlet.http.HttpServlet.service(HttpServlet.java:722)在javax.servlet.http.HttpServlet.service(HttpServlet.java:621) .java:304)位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)位于org.apache.catalina。 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)处的org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)处的core.StandardContextValve.invoke(StandardContextValve.java:164)在org.apache.catalina.val org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)处的ves.ErrorReportValve.invoke(ErrorReportValve.java:100)在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:166)上的.process(Http11Protocol.java:188)org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java) :302),位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145),位于java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615),位于java.lang.Thread.run(Thread。 java:745)
您尚未在Structure
类中定义结构字段的顺序。 JNA需要此信息以便正确地从本机内存读取和写入。
您还错误地映射了本地char
和char[]
。
对于A
类,您需要:
double Value;
byte Type;
byte[] Name = new byte[100];
byte[] SymbolTableName = new byte[100];
int updateMode;
int dataType;
byte ulSize;
protected List getFieldOrder() {
return Arrays.asList("Value", "Type", "Name", "SymbolTableName", "updateMode", "dataType", "ulSize");
}
对于B
类,您需要:
protected List getFieldOrder() {
return Arrays.asList("numAs", "as");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.