百独托管7500 紫田网络超高转化播放器收cps[推荐]速盾CDN 免实名免备防屏蔽阿里云 爆款特卖9.9元封顶提升alexa、IP流量7Q5团队
【腾讯云】中小企福利专场【腾讯云】多款产品1折起高防 随时退换 好耶数据小飞国外网赚带你月入万元炎黄网络4H4G10M 99每月
香港带宽CN2/美国站群优惠中客数据中心 服务器租用联盟系统移动广告平台 中易企业专场腾讯云服务器2.5折九九数据 工信部正规资质
腾讯云新用户大礼包代金券高价收cpa注册量高价展示【腾讯云】2核2G/9.93起租服务器找45互联 随时退换阿里云 短信服务 验证秒达

[闲聊畅谈] java 调用C++ dll问题记录 [复制链接]
查看:386 | 回复:0

1099

主题

3121

帖子

1057

积分

落伍者(两全齐美)

Rank: 2

贡献
159
鲜花
1
注册时间
2005-10-17

落伍手机绑定

发表于 2021-9-3 17:14:47 | 显示全部楼层 |阅读模式 来自 中国湖北
问题一 函数无法被调用
找不到函数,首先检查函数名称是否相同,在函数名称相同的情况下,我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
调用类:

        final  AiteTrackerDll 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2024-11-26 14:44 , Processed in 0.045200 second(s), 32 queries , Gzip On.

返回顶部