当前位置: 首页 > 知识库问答 >
问题:

JNA中的未知源错误(在C中返回结构数组函数)

闾丘鸣
2023-03-14
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;

}
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);
    }
}

共有1个答案

淳于恺
2023-03-14

您还没有在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");
}
protected List getFieldOrder() {
    return Arrays.asList("numAs", "as");
}
 类似资料:
  • 问题内容: 我正在尝试从CSV文件中的一组数字中找到最大值和最小值。我的代码在某些行中始终为Max函数返回错误的数字。这是我的代码: 我的输出示例: 我不确定我做错了什么。一些建议,将不胜感激。 问题答案: 您的列表元素是字符串。您需要对其进行转换,以避免按字典顺序进行比较(按字母顺序,一次只比较一个字符,这是因为) 除非您实际上想要字符串,否则不要创建新列表,而只需传递给您的函数即可:

  • jna 中 structure 结构体怎么读取, 在回调函数中 我收到对方返回一个 pointer 是海康的sdk NET_DVR_SetDVRMessageCallBack_v50 的回调函数 有个 pAlarmInfo:Pointer 类型, 想接收为 NET_DVR_ACS_ALARM_INFO 类型, 要怎么做 我试过这样读取, 但没有讲到到

  • 这是我的合约代码。在这里,我试图存储特定行程的坐标。虽然存储信息合约执行良好。但是当我检索数据时,它应该给出坐标数组。但它抛出了一个错误。 原因:'uint256类型的数据不足' 我在这里错过了什么。有没有其他方法来实现我在这里尝试的? 附言:我是固体新手。

  • 我的程序返回错误et,我不知道为什么。我如何解决这个问题? 错误: 错误:无法将“std::ostream{aka std::basic\u ostream}”左值绑定到“std::basic\u ostream”

  • 我想用C++做一个简单的函数来练习一下。它应该做与python中的range()函数相同的事情,但现在要简单得多。我遇到了一个问题,数组没有正确地从函数返回到主函数。我曾经在下面编码,得到了一个奇怪的错误。有人知道问题出在哪里吗?

  • 问题内容: 我试图弄清楚需要更改什么SWIG接口文件才能处理getFoo返回一个指向自定义结构数组(sender_id_t)的指针。没有任何特殊的SWIG接口代码,我只得到Java端的指针。如何将指针转换为可以循环或迭代的内容(在Java中),以便获取每个sender_id_t id值?感谢任何建议。 C结构: C函数: 例外: 问题答案: 最简单的解决方案不涉及编写任何JNI,实际上是方法2。因