java用JNA调用c/c++的dll接口时,怎么获取接口中的out参数,例如:
SCardEstablishContext(INDWORDdwScope,INLPCVOIDpvReserved1,INLPCVOIDpvReserved2,OUTLPS...
SCardEstablishContext(
IN DWORD dwScope,
IN LPCVOID pvReserved1,
IN LPCVOID pvReserved2,
OUT LPSCARDCONTEXT phContext);
jnative返回的是phContext的值,而不能正确返回return值,不知道这个该怎样获取返回值。
上面的弄错了,是这样的
int BUSINESS_HANDLE( char* inputData,char* outputData)
java return返回的是int还是outputData,如果返回的是int,那么怎么回去outputData 展开
IN DWORD dwScope,
IN LPCVOID pvReserved1,
IN LPCVOID pvReserved2,
OUT LPSCARDCONTEXT phContext);
jnative返回的是phContext的值,而不能正确返回return值,不知道这个该怎样获取返回值。
上面的弄错了,是这样的
int BUSINESS_HANDLE( char* inputData,char* outputData)
java return返回的是int还是outputData,如果返回的是int,那么怎么回去outputData 展开
展开全部
java通过jna调用c++/c的.dll/.so库接口
1。通过jni技术可以实现java调用so文件(这个自己实现了,以前的日志也有,并没有用jni来调用dll文件,原因是自己对这个不熟啊,不知道怎样生成dll文件。。。。)。
2.使用jni的时候会显得很繁琐,因为要有许多函数的声明要相同,jna技术就可以省却这一点,拿到一个现成的dll,只要知道函数声明,就可以直接调用了(用jna还未实验调用so文件)。
下面介绍一下jna调用dll的过程。
1.导入jna.jar包,这个就不说了,下载一个就可以了。
2.主要代码:
import com.sun.jna.Library;import com.sun.jna.Native;public interface Net extends Library { Net lib = (Net)Native.loadLibrary("NetDvr2", Net.class); int NETDVR_startup();}//调用public class TestJna { public static void main(String[] args) { System.out.println(Net.lib.NETDVR_startup()); }}NetDvr2.dll放在工程的根目录下边即可。
可能出现的错误:
java.lang.UnsatisfiedLinkError: Unable to load library 'NetDvr2': ???????¨
原因是NetDvr2.dll(或者NetDvr2.so)还依赖于其他几个dll(so)文件,把他们一起拷到该java工程的根目录就行了。
查看一个dll文件所依赖的dll文件可以用Depends.exe。
1。通过jni技术可以实现java调用so文件(这个自己实现了,以前的日志也有,并没有用jni来调用dll文件,原因是自己对这个不熟啊,不知道怎样生成dll文件。。。。)。
2.使用jni的时候会显得很繁琐,因为要有许多函数的声明要相同,jna技术就可以省却这一点,拿到一个现成的dll,只要知道函数声明,就可以直接调用了(用jna还未实验调用so文件)。
下面介绍一下jna调用dll的过程。
1.导入jna.jar包,这个就不说了,下载一个就可以了。
2.主要代码:
import com.sun.jna.Library;import com.sun.jna.Native;public interface Net extends Library { Net lib = (Net)Native.loadLibrary("NetDvr2", Net.class); int NETDVR_startup();}//调用public class TestJna { public static void main(String[] args) { System.out.println(Net.lib.NETDVR_startup()); }}NetDvr2.dll放在工程的根目录下边即可。
可能出现的错误:
java.lang.UnsatisfiedLinkError: Unable to load library 'NetDvr2': ???????¨
原因是NetDvr2.dll(或者NetDvr2.so)还依赖于其他几个dll(so)文件,把他们一起拷到该java工程的根目录就行了。
查看一个dll文件所依赖的dll文件可以用Depends.exe。
展开全部
我觉得java return返回的是int,int代表应该是返回值类型(成功或者失败代码0 1 -1啥的)。要得到outputData在函数里传个char[]类型的值应该就行了吧。
追问
试过了,不行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个在网上有很多例子的。
char* outputData 参数对应 java中的应该是jstring或是jbyte[],本地代码中在返回前,生成java类型数据赋值给这个参数才可以。
char* outputData 参数对应 java中的应该是jstring或是jbyte[],本地代码中在返回前,生成java类型数据赋值给这个参数才可以。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你好,我也碰到和你一样的问题,请问你解决了嘛?请教一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询