简体   繁体   English

JNA中的未知源错误(C中的Return Struct Array函数)

[英]Unknown Source Error in JNA ( Return Struct Array function in C)

I try to make JNA application. 我尝试制作JNA应用程序。 However , I can not get sturct array from C. I get error in java side ( com.sun.Proxy.$Proxy0.fill(Unknown Source) ) 但是,我不能从C获取sturct数组。我在Java端遇到错误( com.sun.Proxy。$ Proxy0.fill(Unknown Source)

This is my part of c code below. 这是我下面的c代码的一部分。 I compiled as shared libary and I can use other functions. 我编译为共享库,并且可以使用其他功能。 Just giving error when I call fill function . 调用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;

}

This is my Java Part below. 这是我下面的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);
    }
}

How will I correct this error ? 我将如何纠正此错误? Why it happens? 为什么会发生? Maybe there is something missing what ı can not see( Java side or c side ). 也许有一些缺少我看不到的东西(Java端或c端)。 Thanks for any helps. 感谢您的帮助。

at com.sun.jna.Structure.getFields(Structure.java:911) at com.sun.jna.Structure.deriveLayout(Structure.java:1058) at com.sun.jna.Structure.calculateSize(Structure.java:982) at com.sun.jna.Structure.calculateSize(Structure.java:949) at com.sun.jna.Structure.allocateMemory(Structure.java:375) at com.sun.jna.Structure.(Structure.java:184) at com.sun.jna.Structure.(Structure.java:172) at com.sun.jna.Structure.(Structure.java:159) at com.sun.jna.Structure.(Structure.java:151) at MyTest.TestClass$Test$B.(TestClass.java:38) at MyTest.TestClass$Test$B$ByValue.(TestClass.java:39) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at java.lang.Class.newInstance(Class.java:379) at com.sun.jna.Structure.newInstanc 在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) at com.sun.jna.Function.invoke(Function.java:408) at com.sun.jna.Function.invoke(Function.java:315) at com.sun.jna.Library$Handler.invoke(Library.java:212) at com.sun.proxy.$Proxy0.fill(Unknown Source) at MyTest.TestClass.funcc(TestClass.java:63) at MyTest.t7500.doGet(t7500.java:51) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.val 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 ves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) 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)

You haven't defined the order of structure fields within your Structure classes. 您尚未在Structure类中定义结构字段的顺序。 JNA needs this information in order to properly read and write from native memory. JNA需要此信息以便正确地从本机内存读取和写入。

You have also incorrectly mapped native char and char[] . 您还错误地映射了本地charchar[]

For class A , you need this: 对于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");
}

For class B , you need this: 对于B类,您需要:

protected List getFieldOrder() {
    return Arrays.asList("numAs", "as");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM