繁体   English   中英

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

[英]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需要此信息以便正确地从本机内存读取和写入。

您还错误地映射了本地charchar[]

对于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.

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