关于jna调用dll的问题

关于jna调用dll的问题,第1张

public class test {

public static void main(String[] args) {

int dwMachineNumber;

IntByReference dwYear = new IntByReference();

IntByReference dwMonth = new IntByReference();

IntByReference dwDay = new IntByReference();

IntByReference dwHour = new IntByReference();

IntByReference dwMinute = new IntByReference();

IntByReference dwDayOfWeek = new IntByReference();

boolean result = dmapiINSTANCEGetAllUserID(dwMachineNumber,dwYear,dwMonth,dwDay,dwHour,dwMinute,dwDayOfWeek);

}

}

import comsunjnaLibrary;

import comsunjnaNative;

import comsunjnaStructure;

public interface dmapi extends Library {

dmapi INSTANCE = (dmapi)NativeloadLibrary("dmapi", dmapiclass);

public boolean GetAllUserID (

int dwMachineNumber,

IntByReference dwEnrollNumber,

IntByReference dwEMachineNumber,

IntByReference dwBackupNumber,

IntByReference dwMachinePrivilege,

IntByReference dwEnable

);

}

还有问题上QQ

我感觉你这样设计有问题,JNI中java和C/C++的方法应该是保留java的方法名,当然这个不是重点,重点是你里面的参数显然不一致。ByteByReference是个对象类型,我们无法把它弄成一个指针类型,毕竟java没有指针。我的建议是,pBuffer不要作为参数,用具体的类型。pBuffer作为全局变量在别的地方初始化,这样不影响你在invoke方法里面用pBuffer来获取值。我这只是从你的描述简单的看,具体的需求我也不太清楚你要做什么,个人建议。

解决java调dll报Unable to load library的错误可以尝试以下方法:

载入库文件有两个函数,Systemload 和 SystemloadLibrary。

当使用Systemload时,需要输入文件的全路径,例如:Systemload(“/tmp/testso”);

当使用Systemloadlibrary时是在系统的library 的目录中需找复合条件的库文件,可以使用-Djavalibrarypath=[path]参数,来指定Java程序加载库文件的路径,或者将库文件(so,dll)复制到include的默认路径,Linux一般是/usr/lib目录下,当然你可以编辑/etc/ldsoconfd/下的文件,设定自己的库查找路径ldconfig -v|grep xxx看看有没有你的动态库。

Linux还要注意,使用SystemloadLibrary(name)方法其中参数内容与Windows有区别,Linux中的的库文件名为libnameso,Windows为namedll。

在Windows中尽量使用Windows的C/C++编译器生成dll文件,否则会出现问题。

不过具体问题还要具体对待!

以上就是关于关于jna调用dll的问题全部的内容,包括:关于jna调用dll的问题、想知道java怎么取com.sun.jna.ptr.ByteByReference里面的数据。、如何解决java调dll报Unable to load library的错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9466280.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存