【问题标题】:Unknown Source Error in JNA ( Return Struct Array function in C)JNA 中的未知源错误(C 中的返回结构数组函数)
【发布时间】: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 -> Java byte,一个,原生数组struct字段需要是Java数组Structure字段。
  • 您的直接错误是您还没有为Structure 实现getFieldOrder()。这需要按顺序返回结构字段名称的List

标签: java c struct jna


【解决方案1】:

您尚未在 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");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多