Java访问Qt编写的dll

请提供可行的方法最好是用JNA框架(如果JNA可行的话)请给出完整的测试例子请~教我,谢谢1.直接使用JNI相当的麻烦,使用JNI的优先级放到最低。2.perfectro... 请提供可行的方法
最好是用JNA框架(如果JNA可行的话)
请给出完整的测试例子
请~教我,谢谢
1.直接使用JNI相当的麻烦,使用JNI的优先级放到最低。
2.perfectrobin朋友给出的示例,访问的是系统dll并不是qt编写的。
没用的,虽然我不知道为什么,按同样的方法是不可行的,不然我也不会这么纠结了。

问题自己解决了:
使用JNavtive
1.一开始载入失败是因为依赖库找不到,这个和环境变量(path)有关,改完了重启Eclipse(写Java代码),才能生效。我就是因为没有重启Eclipse所以才载入失败的。
2.载入成功后又找不到方法了(我的测试代码中是p02)。纠结了N久。
后来发现有(HA_DLL Export Viewer1.36)软件可以看dll文件中的函数。
试了下发现方法名称p02变成了_ZN7MyWin023p02Ev,将这个代入Java代码中,测试成功。
至于方法名称为什么变成了这样,且JNative无法识别,可能和编译器有关。
展开
 我来答
pe...n@sina.com
2010-04-28 · TA获得超过893个赞
知道小有建树答主
回答量:189
采纳率:0%
帮助的人:227万
展开全部
1、使用JNI
http://baike.baidu.com/view/1272329.htm?fr=ala0_1_1

2、JNative简单示例

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

public class SystemTime extends AbstractBasicData<SystemTime> {
public short wYear;
public short wMonth;
public short wDayOfWeek;
public short wDay;
public short wHour;
public short wMinute;
public short wSecond;
public short wMilliseconds;

public Pointer createPointer() throws NativeException {
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));
return pointer;
}

public int getSizeOf() {
return 8 * 2;
}

public SystemTime getValueFromPointer() throws NativeException {
wYear = getNextShort();
wMonth = getNextShort();
wDayOfWeek = getNextShort();
wDay = getNextShort();
wHour = getNextShort();
wMinute = getNextShort();
wSecond = getNextShort();
wMilliseconds = getNextShort();
return this;
}

public SystemTime() throws NativeException {
super(null);
createPointer();
mValue = this;
}

@Override
public String toString() {
return wYear + "/" + wMonth + "/" + wDay + " at " + wHour + ":" + wMinute + ":" + wSecond + ":" + wMilliseconds;
}

public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime");
SystemTime systemTime = new SystemTime();
nGetSystemTime.setParameter(0, systemTime.getPointer());
nGetSystemTime.invoke();
return systemTime.getValueFromPointer();
}

public static void main(String[] args) throws NativeException, IllegalAccessException {
System.err.println(GetSystemTime());
}

}

这个就是简单示例,调用系统的dll和调用qt的dll有区别吗?qt也应该是export出来入口点吧,原理上应该一样的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式