妖气当然你 2023-02-21 20:20 采纳率: 0%
浏览 117
已结题

java通过jna调用dll,dll里面的founction为c++,怎样封装为c动态链接库来让java调用

已知一个dll 方法如下 大致就是calculate_adc_dynspec(*in,*out); out为方法输出结果
void __cdecl calculate_adc_dynspec(int * __ptr64,int,int,double * __ptr64 const,int * __ptr64 const,int,int,double,double * __ptr64,double * __ptr64,double * __ptr64,double * __ptr64,double * __ptr64,double * __ptr64,double * __ptr64,double * __ptr64,double * __ptr64)
如果java通过jna调用,请问如何给他传参,以及接收返回值

img


网盘里为传入的第一个数据文件以及调用文件,数据文件以空格和换行分割,为传入第一个参数。
链接:https://pan.baidu.com/s/13XqMrK_qwByZ09V4NCq2yg?pwd=1235
提取码:1235
调用之后debug显示

img


个人也使用gpt生成相关代码,但也是debug有一直Source not found.请各位大佬指教。

经验证,此问题的关键在于此dll中的方法在depnedencie中为c++,jna中好像并不能直接调用,请问如何把此dll封装成c动态链接库让jna来调用,方法头文件如图所示

  • 写回答

7条回答 默认 最新

  • __AtYou__ 2023-02-21 20:57
    关注

    可以创建以下Java接口:

    import com.sun.jna.Library;
    import com.sun.jna.Native;
    import com.sun.jna.Pointer;
    
    public interface MyDll extends Library {
        MyDll INSTANCE = (MyDll) Native.loadLibrary("mydll", MyDll.class);
    
        void calculate_adc_dynspec(Pointer in, int a, int b, Pointer out1, Pointer out2, int c, int d, double e, double f, Pointer g, Pointer h, Pointer i, Pointer j, Pointer k, Pointer l, Pointer m, Pointer n);
    }
    

    接下来,需要准备输入和输出参数并将它们传递给calculate_adc_dynspec方法。这个方法接受多个参数,其中一些是指针类型,JNA需要将它们包装在Pointer类中。以下是一个示例代码,该代码向calculate_adc_dynspec方法传递参数,并从输出指针中检索结果:

    int[] inArray = {1, 2, 3, 4};
    Pointer in = new Memory(inArray.length * Native.getNativeSize(Integer.TYPE));
    in.write(0, inArray, 0, inArray.length);
    
    double[] outArray = new double[10];
    Pointer out = new Memory(outArray.length * Native.getNativeSize(Double.TYPE));
    out.write(0, outArray, 0, outArray.length);
    
    MyDll.INSTANCE.calculate_adc_dynspec(in, 1, 2, out, out, 3, 4, 5.0, 6.0, out, out, out, out, out, out, out, out, out);
    
    out.read(0, outArray, 0, outArray.length);
    
    评论

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 修改了问题 2月23日
  • 修改了问题 2月21日
  • 修改了问题 2月21日
  • 展开全部

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?