问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java调用dll如何传入指针?invoke后如何获取指针的值?

发布网友 发布时间:2022-05-05 22:10

我来回答

1个回答

热心网友 时间:2022-06-28 04:43

假设我有一个叫test.dll的动态库,其中有一个函数如下:
  extern "C" int add(int* a,int* b,int* c,int d,char* PicPath)
  {
  FILE *fp;
  fp=fopen(PicPath,"wt");
  for(int i=0;i
  {
  c[i]=a[i]+b[i];
  fprintf(fp,"%d\n",c[i]);
  }
  fclose(fp);
  return 1;
  }
  该函数的功能是a,b两个数组的值相加,和存放的数组c中,在将和写入到指定的文件,数组的维数
  有传入的参数决定。
  问题提出:
  1.Java中如何调用指针类型的参数;
  2.整形的参数可以直接传入吗?;
  3.PicPath为何是指针型的,怎么不是CString类型的;
  4.如何获取输入型参数的返回值;
  Java调用动态链接库的代码如下:
  JNative t= new JNative("test.dll", "add"); //加载test.dll文件,并调用add方法;
  t.setRetVal(Type.INT); // 设置调用后的返回类型
  // Java中构造指针,并为指针分配空间
  Pointer a = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
  Pointer b = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
  Pointer c = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));
  Pointer strP= createPointer(100);
  strP.setStringAt(0, "C:\\1.txt");
  int d=10;
  // 为数组a和b赋值
  for (int i = 0; i
  a.setIntAt(4 * i, i);
  b.setIntAt(4 * i, i);
  }
  // 设置参数:
  t.setParameter(0, a);
  t.setParameter(1, b);
  t.setParameter(2, c);
  t.setParameter(3, d);
  t.setParameter(4, strP);
  t.invoke(); // 调用函数并执行
  // 输出和的值,注意:一个整形值需要用4个字节存储,所以j前面需要乘以4
  for (int j = 0; j
  System.out.println(c.getAsInt(4 * j));
  }
  // 释放内存
  a.dispose();
  b.dispose();
  c.dispose();
  好了,这样一个完整的调用例子就结束了,我只是写出了程序中的关键的代码,具体的还需要写一
  个类,并且继承一个基类,在复写基类中的方法,这些都比较简单,大家可以参考一下网上的其他
  例子。
  问题解答:
  1.Java中调用指针类型的参数:需要创建Pointer变量,并为其分配空间
  2.整形的数据可以直接传入;
  3.JNative对CString类型支持不是很良好,调用CString的方法时,经常会报一些异常,所以我把路径改成
  的字符指针;
  4.输入型参数作为输出:可以参见以上的例子,数组c是如何设置和输出的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
路上捡到一只小狗,请各位大侠鉴定下什么品种。好知道她的习性、好喂养... ...请各位大侠说说他是什么品种狗狗,成年后会多大?谢谢! 麻烦各位大侠能帮我看看这狗是什么品种的狗吗?包括生活习性,血统智商... 求鉴定这是什么品种的小狗...谢谢了。前几天刚买的 各位大侠,请问下面这个小狗叫什么名字 家庭用的开关有多少种怎么用 智能开关安装和普通开关安装的区别 美国缔造者,洛克菲勒家族是如何百年不衰的? 亿万富豪,犹太人洛克菲勒:让自己变聪明的人,有3个“愚蠢” 改病句:汽车质量的好坏,也是保证行车安全的一个很重要条件。 6、如何来理解“java中没有指针传递,只有值传递”这句话。 c++函数指针和多态的关系,与Java的联系 Java中怎么实现C++中函数指针类似的功能 Java引用和C++指针的区别 在java中没有指针,如何修改函数中参数的值 java中有类似于函数指针的东西没 java为什么没有指针 java里的指针和c++指针的区别 java 中怎么表示函数指针 iphone用什么音乐播放器能提高音质 java怎么使用类似c++的函数指针? 狮子座女10月爱情运势2021 求教:Java支持函数指针吗 未来两个月狮子座运势 1月份狮子座身体运势 狮子座明年运势? 2022年最幸福的星座 狮子座的爱情运势 4000013729是光大银行提额电话吗 仙剑奇侠传3(电视剧)里面的龙葵是什么人?好人还是坏人?关于她发生什么事? java调用类中函数提示野指针怎么改啊? java 小时钟,怎么理解用数学函数求指针端点坐标 孕妇能用安利的沐浴露吗? 孕妇能用安利牌沐浴露吗 孕妇可以使用安利雅蜜润肤沐浴露么 孕妇能用安利的沐浴露吗 孕期可以用安利沐浴露吗 孕妇可以用的沐浴露,求推荐! 孕妇适合哪种沐浴露呢是用平时的就可以还是需要用孕妇专用的啊,怀孕期间需要注意哪些事项啊? 孕妇可以用什么牌子的洗发水和沐浴露 同仁堂灵芝孢子粉过期还能吃吗? 真空包装的灵芝孢子粉放在冰箱裏没有拆封过期一年了,能不能食用,谢谢。 寿仙谷破壁灵芝孢子粉过期可服用吗? 吃了过期的灵芝破壁孢子粉会怎样该怎么办 企业怎么注销 vivo y23l场景桌面怎么恢复出厂时的样子 vivoy23l自从恢复出厂设置后就一直充不进电,而且也开不了机 vivoY23L怎么设置后台运行? 泫雅在演出的时候上衣突然滑落,这是故意设计好的还是一不小心导致的? 荣耀30是外置基带吗?