java 调用C++ dll问题记录
问题一 函数无法被调用找不到函数,首先检查函数名称是否相同,在函数名称相同的情况下,我c++的函数中有 _stdcall签名,去除_stdcall签名后可进行正常调用。
问题二 c++代码 SetTimer定时器无法触发回调函数
在接口中我设置了回调函数,以让c++程序定时给java程序传送数据,但是发现通过java的调用定时器无法执行,java程序中的回调函数更无法接收到消息(被调用)。
最后多处查询得知:
SetTimer 依赖线程的消息队列, 需要消息引擎, 回调函数是在系统的默认消息处理函数中去调用的
MSDN
When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER
也就是在JAVA中调用时,SetTimer不能支持也就不会被触发。最后使用定时器队列代替,触发正常
m_hTimerQueue = CreateTimerQueue();
1
问题三 调用带回调函数的c++ dll时如何编码?
这里做个记录
接口类:
public interface AiteTrackerDll extends Library {
boolean _InitTracker(String cameraName, int width, int height);
void _CloseTracker();
void _OnGazeImage(Callback onGazeImage, int debugMode);
void _OnGazeData(Callback onGazeData);
void _SetCalibration(float[] data);
void _SetCompensate(float distanceCompensate);
void _SetCalibrateStatue(int mode);
public static class ONGAZEIMAGEimpl implements ONGAZEIMAGE{
public void MessageHandle(int width, int height, int step, String data) {
System.out.println("回调成功");
}
}
public interface ONGAZEDATA extends StdCallLibrary.StdCallCallback {
public abstract void MessageHandle(float leftX, float leftY, float rightX, float rightY, float distance, float leftPupilRadius, float rightPupilRadius);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
调用类:
finalAiteTrackerDll instance= Native.loadLibrary("dll\\AiteTracker", AiteTrackerDll.class);
AiteTrackerDll.ONGAZEDATA callback = new AiteTrackerDll.ONGAZEDATAimpl();
AiteTrackerDll.ONGAZEIMAGE callback1 = new AiteTrackerDll.ONGAZEIMAGEimpl();
instance._OnGazeData(callback);
instance._OnGazeImage(callback1,0);
————————————————
武汉兰树网络科技有限公司
www.ls-idc.com
QQ:775260000
TG:@lsidc
页:
[1]