
public interface MyCDll extends Library {
MyCDll INSTANCE = (MyCDll)NativeloadLibrary("MyCDll", MyCDllclass);
public static class CFile extends Structure {
public ByteByReference _ptr = new ByteByReference();
public int _cnt;
public ByteByReference _base = new ByteByReference();
public int _flag;
public int _file;
public int _charbuf;
public int _bufsiz;
public ByteByReference _tmpfname = new ByteByReference();
public static class ByReference extends CFile
implements StructureByReference{}
public static class ByValue extends CFile
implements StructureByValue{}
}
public CFileByReference fopen(byte[] filename,int len1, byte[] model,int len2);
public int fread(byte[] br, int size, int count, CFile f);
public int fclose(CFile br);
}
这是用java模拟的C的File类。java调用需要的写好的dll或so的动态库。动态库中的所有方法都可以用JNA来描述
loadLibrary的第一个参数是一个三元表达式,意思是,如果平台为windows则用msvcrt为参数值,否则用c++为参数值。 第二个参数就是指你要加载的类的文件名。
三个点表示是最后的参数,位置是放在最后的。如果你把Object args放到前面去就会报错,提示你放到最后。
private HWND getHWnd(Component w) {
HWND hwnd = new HWND();
hwndsetPointer(NativegetComponentPointer(w));
return hwnd;
}
你可以去看一下,
\jna\src-full\src\com\sun\jna\examples\WindowUtilsjava
public static void setWindowAlpha(Window w, float alpha) {
getInstance()setWindowAlpha(w, Mathmax(0f, Mathmin(alpha, 1f)));
}
窗体透明, 你跟一下代码, 就知道怎么获取HWND的
应该是keyPadLibrary的定义有问题,最好是把h文件贴上来看看。
不过估计是有些参数是out参数,你用String的话是不对的,最明显的就是出错的这个地方,函数返回的int是表示函数执行结果,那么你要怎么获取加密后的数据呢(这个应该是执行加密吧)
看看其声明,如果参数标记为out的那么是传出参数,也就是用于返回结果的,不过有时in和out是合用的。
这样是不行的啊,你的问题出在C语言端,java统一是utf-8编码,而C语言不是,你这些写写个常量,编译为dll,java调用肯定错的。
你得在c里面返回unnicode码,方法:
用jdk工具,在jdk——home/bin下面有native2asciiexe这个是转码用的工具
双击打开,
输入 北京
得到unicode码 \u00b1\u00b1\u00be\u00a9
应该 reutrn "\u00b1\u00b1\u00be\u00a9"; java再unicode编码处理即可
以上就是关于在C++向JAVA提供调用接口时,需要一个指向java class的指针,怎么实现,JNA库中有方法吗全部的内容,包括:在C++向JAVA提供调用接口时,需要一个指向java class的指针,怎么实现,JNA库中有方法吗、jna中的方法loadLibrary的第一个和第二个参数分别代表什么意思另外Object后面为什么加上三个"."、jna调dll的方法时,参数不对为什么也可以调到等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)