【问题标题】:jna passing several parameterjna 传递几个参数
【发布时间】:2018-05-25 15:47:13
【问题描述】:

我正在尝试通过使用 JNA 使我的 .so 与 java 代码一起使用。 首先,我只是想在 cout

这是我的 .so 中的 .h

class WestgardInterface {

private:
    static WestgardInterface *ms_instance;

protected:
    /*CONSTRUCTOR*/
    WestgardInterface();

public:
    /*DESTRUCTOR*/
    ~WestgardInterface();

    static WestgardInterface *getInstance();

    void WGevaluate( Measure m, double mean, double sd);
};

extern "C" void WGevaluate( Measure m, double mean, double sd){
    WestgardInterface* lib = WestgardInterface::getInstance();
    return lib->WGevaluate( m, mean, sd);
}

然后是我的 .cpp

WestgardInterface *WestgardInterface::ms_instance = nullptr;

/** @details Constructor*/
WestgardInterface::WestgardInterface(){
    // TODO Auto-generated constructor stub
}

/** @details Destructor*/
WestgardInterface::~WestgardInterface() {
    // TODO Auto-generated destructor stub
}


WestgardInterface *WestgardInterface::getInstance(){
    if (nullptr == ms_instance)
    {
        ms_instance =  new WestgardInterface();
    }
    return ms_instance;
}
void WestgardInterface::WGevaluate(Measure m, double mean, double sd) {
    cout<<"measure"<<m.getValue()<<endl<<m.getDate();
    cout<<"mean"<<mean<<endl<<"sd"<<sd<<endl;
}

现在让我们看看我的java代码

public interface InterfaceLibWestgard extends Library {

    void WGevaluateWithListOnly(WGInputs.ByValue input);

    static InterfaceLibWestgard INSTANCE = (InterfaceLibWestgard) 
Native.loadLibrary("../logic/resources/calculator/libuntitled.so", 
InterfaceLibWestgard.class);
}

WGInputs 类

public class WGInputs extends Structure {
    public Measure.ByValue m;
    public double mean;
    public double sd;

    public static class ByValue extends WGInputs implements Structure.ByValue {}

    @Override
    protected List<String> getFieldOrder() {
        return Arrays.asList(new String[] { "m" , "mean" , "sd" }); // native variables order
    }

}

最后是主要的

public class Westgard {
    static {       
    System.setProperty("jna.library.path","../logic/resources/calculator");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        WGInputs.ByValue jnaInputs = new WGInputs.ByValue();
        Measure.ByValue m = new Measure.ByValue();
        m.valeur = 18;
        Date.ByValue d = new Date.ByValue();
        d.m_day = 10;
        d.m_month = 10;
        d.m_year = 10;
        d.m_hour = 12;
        d.m_min = 12;
        d.m_sec = 12;
        m.date = d;
        jnaInputs.m = m;
        jnaInputs.mean = 7.5;
        jnaInputs.sd = 4d;
        InterfaceLibWestgard.INSTANCE.WGevaluateWithListOnly(jnaInputs);

    }
}

所以当它运行时它应该在终端上写这个

measure18
date = 10/10/10
heure = 12:12:12
mean 7.5
sd4

但是我得到了这个

measure18
date = 10/10/10
heure = 12:12:12
mean0
sd3.51276e+151

【问题讨论】:

    标签: java c++ jna .so


    【解决方案1】:

    最后发现只是需要更改 java 端并将所有 ref 抑制为 mean 和 sd 然后像这样定义函数 无效 WGevaluateWithListOnly(WGInputs.ByValue 输入,浮点均值,浮点 sd);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-28
      • 2018-02-03
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多