项目需要从DLL中调用方法,但是接口是JAVA程序,目前只知道DLL中的方法名和参数,貌似不能用JNI来实现。
在百度中搜索的资料很有限,只晓得可以用jawin这个工具来实现。目前只有一个例子import org.jawin.funcptr;
import org.jawin.returnflags;
public class createppt {
public static void main(string[] args) {
try {
funcptr msgbox = new funcptr("user32.dll", "messageboxw");
msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false);
} catch (exception e) {
e.printstacktrace();
}
可怜我才学了1个星期JAVA就遇到这个棘手的问题,熟悉jawin的大大能解释一下这个类吗?
在百度中搜索的资料很有限,只晓得可以用jawin这个工具来实现。目前只有一个例子import org.jawin.funcptr;
import org.jawin.returnflags;
public class createppt {
public static void main(string[] args) {
try {
funcptr msgbox = new funcptr("user32.dll", "messageboxw");
msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false);
} catch (exception e) {
e.printstacktrace();
}
可怜我才学了1个星期JAVA就遇到这个棘手的问题,熟悉jawin的大大能解释一下这个类吗?
将jawin.dll放于c win32下。
我是这么理解的,不知道对不对
funcptr msgbox = new funcptr("user32.dll", "messageboxw");
msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false);
这2句中,messageboxw是user32.dll中的方法。
msgbox.invoke()是将参数传给方法messageboxw。
import org.jawin.funcptr;
import org.jawin.returnflags;
public class createppt {
public static void main(string[] args) {
try {
funcptr msgbox = new funcptr("user32.dll", "messageboxw"); //获得函数指针
msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false);
/*1. 指令字符串。一个"XXX:Y:ZZZ"格式的字符串。其含义分别是传入参数中的每个字节的数据类型意义、返回值的类型、需要从传入指针中读取的数据(inout类型参数)。比如:函数签名int func(int, int, struct s*, char*); //其中struct s*调用完函数后需要读出,struct s所占字节数为16。其指令字符串为:IIP16G:I:L4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型I对应的4个字节,然后是inout类型的参数中n16对应的16个字节。其中字符串的意义可以在Jawin提供的文件instructions.h中找到,或者在官方文档(Jawin数据指令)中找到常用的一些指令字符串的意义。2. 传入参数的总字节大小。3. 前面写好的传入参数的原始字节流。4. 一个object数组。5. ReturnFlags,用以根据C/C++返回值将C/C++的错误转换为Java的异常并抛出。其中CHECK_NONE表示不检查;CHECK_FALSE和CHECK_WIN32分别表示返回0是FALSE和SUCCESS,根据是否出错决定是否抛出异常;CHECK_HRESULT表示使用COM模型中的HRESULT作为返回值,其错误码可以配置。*/
} catch (exception e) {
e.printstacktrace();
}
UDPPwd(String snh, String pwd, String newpwd)这样写对吗?
funcptr sms = new funcptr("user32.dll", "UDPPwd");
sms.invoke(snh, pwd, newpwd, returnflags.fail_on_false);
有什么问题再探讨!