【发布时间】:2015-06-15 22:44:57
【问题描述】:
我尝试制作 JNA 应用程序。但是,我无法从 C 中获取 sturct 数组。我在 java 端出现错误 (com.sun.Proxy.$Proxy0.fill(Unknown Source))
这是我下面的 c 代码的一部分。我编译为共享库,我可以使用其他功能。当我调用填充函数时只是给出错误。
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.calculateSize(Structure.java:949) 在 com.sun.jna.Structure.allocateMemory(Structure.java:375) 在 com.sun.jna.Structure.(Structure.java:184) 在 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.(TestClass.java:38) 在 MyTest.TestClass$Test$B$ByValue.(TestClass.java:39) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 java.lang.Class.newInstance(Class.java:379) 在 com.sun.jna.Structure.newInstance(Structure.java:1651) 在 com.sun.jna.Function.invoke(Function.java:408) 在 com.sun.jna.Function.invoke(Function.java:315) 在 com.sun.jna.Library$Handler.invoke(Library.java:212) 在 com.sun.proxy.$Proxy0.fill(Unknown Source) 在 MyTest.TestClass.funcc(TestClass.java:63) 在 MyTest.t7500.doGet(t7500.java:51) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 在 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.process(Http11Protocol.java:188) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 在 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)
【问题讨论】:
-
BsVal;或B sVal;?? -
B sVal;这是我在这里写代码时的错误
-
向我们展示堆栈跟踪。
-
您应该重新检查本机到 Java 类型的映射。原生
char-> Javabyte,一个,原生数组struct字段需要是Java数组Structure字段。 -
您的直接错误是您还没有为
Structure实现getFieldOrder()。这需要按顺序返回结构字段名称的List。