在linux上调用海康SDK没有进入函数内

开发语言java
把海康威视 ISUP SDK linux demo的部分代码移到自己的项目里了
但在走到预览监听的时候,判断成功后没有进new FPREVIEW_NEWLINK_CB中,包括FPREVIEW_NEWLINK_CB预览数据回调参数也没有进去
在日志里没有看到函数里的打印输出,想知道这是怎么回事,有没有什么解决方法


    public void startRealPlayListen() {
            //预览监听
            if (fPREVIEW_NEWLINK_CB == null) {
                fPREVIEW_NEWLINK_CB = new FPREVIEW_NEWLINK_CB();
            }
            System.arraycopy(propertiesUtil.readValue("SmsServerListenIP").getBytes(), 0, struPreviewListen.struIPAdress.szIP, 0, propertiesUtil.readValue("SmsServerListenIP").length());
            struPreviewListen.struIPAdress.wPort = Short.parseShort(propertiesUtil.readValue("SmsServerListenPort")); //流媒体服务器监听端口
            struPreviewListen.fnNewLinkCB = fPREVIEW_NEWLINK_CB; //预览连接请求回调函数
            struPreviewListen.pUser = null;
            struPreviewListen.byLinkMode = 1; //0- TCP方式,1- UDP方式
            struPreviewListen.write();

            if (StreamHandle < 0) {
                StreamHandle = hCEhomeStream.NET_ESTREAM_StartListenPreview(struPreviewListen);
                if (StreamHandle == -1) {

                    System.out.println("NET_ESTREAM_StartListenPreview failed, error code:" + hCEhomeStream.NET_ESTREAM_GetLastError());
                    hCEhomeStream.NET_ESTREAM_Fini();
                    return;
                } else {
                    String StreamListenInfo = new String(struPreviewListen.struIPAdress.szIP).trim() + "_" + struPreviewListen.struIPAdress.wPort;
                    System.out.println("流媒体服务:" + StreamListenInfo + ",NET_ESTREAM_StartListenPreview succeed");
                }
            }
        }

FPREVIEW_NEWLINK_CB代码如下:

public class FPREVIEW_NEWLINK_CB implements HCISUPStream.PREVIEW_NEWLINK_CB {
        @Override
        public boolean invoke(int lLinkHandle, HCISUPStream.NET_EHOME_NEWLINK_CB_MSG pNewLinkCBMsg, Pointer pUserData) {
            System.out.println("FPREVIEW_NEWLINK_CB callback");
            log.info("FPREVIEW_NEWLINK_CB callback");
            //预览数据回调参数
            lPreviewHandle = lLinkHandle;
            HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM struDataCB = new HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM();
            if (fPREVIEW_DATA_CB == null) {
                fPREVIEW_DATA_CB = new FPREVIEW_DATA_CB();
            }
            struDataCB.fnPreviewDataCB = fPREVIEW_DATA_CB;

            if (!hCEhomeStream.NET_ESTREAM_SetPreviewDataCB(lLinkHandle, struDataCB)) {
                System.out.println("NET_ESTREAM_SetPreviewDataCB failed err::" + hCEhomeStream.NET_ESTREAM_GetLastError());
                return false;
            }
            return true;
        }
    }

调用的HCISUPStream.PREVIEW_NEWLINK_CB


public interface PREVIEW_NEWLINK_CB extends Callback {
        public boolean invoke(int lLinkHandle, NET_EHOME_NEWLINK_CB_MSG pNewLinkCBMsg, Pointer pUserData);
    }

fPREVIEW_NEWLINK_CB 里没有构造函数,所以new了什么代码也不执行,只是创建了一个对象
而invoke要调用的时候才会执行呀
我不知道具体你这里是注册了个什么事件
我们之前用海康自动识别车牌功能的摄像头的时候,是识别到车牌就会自动调用回调函数
你应该先确定这个事件触发了没有

if (fPREVIEW_NEWLINK_CB == null) 这一个是字符串空""还是null,这个,这个可以debug调试一下比较准确

你全局找下代码fn_NewLinkCb是在哪里被调用的,这里应该是没有被调用,更不用说进入到你的invoke了,所以你debug也好,加日志也好要在被调用之前看下触发条件,找出未触发的原因,
另外你的监听事件是否注册,如果没注册 你的回调也没办法触发

最主要的是我怀疑你这里的代码有问题:
StreamHandle 初始值是不是0,如果你初始化是0,相当于监听事件是不会触发的,这块的逻辑你得打个日志或者debug,看下是否真的启动监听了

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

你的问题可能与回调函数的使用有关。建议检查一下回调函数的使用是否正确,并且确保回调函数定义的参数和回调函数调用时传递的参数类型相同。同时,确保回调函数正确注册并有权利对相关事件做出响应。如果问题依然存在,建议查看日志文件以获取更多信息,或者尝试使用调试器调试程序以排除问题。

  • 根据您提供的代码,FPREVIEW_NEWLINK_CB回调函数没有被调用可能是因为预览连接请求回调函数(fnNewLinkCB)未能成功注册到海康SDK中。您可以按以下步骤进行检查:
  1. 确认您的海康SDK版本是否支持该函数。
  2. 检查代码中hCEhomeStream.NET_ESTREAM_StartListenPreview函数的返回值是否为0,如果不是则说明设置预览监听失败,导致fnNewLinkCB无法被调用。
  3. 检查预览连接请求回调函数的参数类型是否正确,确保使用了正确的类型。
  4. 检查您的日志文件是否记录了任何错误或异常,如果有,请检查并修复。
  • 如有帮助的话,还望采纳哦~

FPREVIEW_NEWLINK_CB 是你自己定义的class,里面有些构造方法吗,我看你贴的代码没有,所以走到预览监听的时候,判断成功后没有进new FPREVIEW_NEWLINK_CB中是正常的。没有进入预览回调方法,那就说明没有设备的连接初始化没有成功

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以尝试以下几种解决方法:

  1. 确认SDK是否正确导入,以及是否与系统内部部分库的版本不兼容。

  2. 确认函数调用参数是否正确传递和初始化。

  3. 检查预览连接请求回调函数的触发条件,是否满足预期的场景或流程。

  4. 添加日志输出,对关键变量或函数的执行结果进行跟踪,帮助定位问题所在。

以下提供一个针对问题可能出现的调试代码,可供参考:

public void startRealPlayListen() {
    if (fPREVIEW_NEWLINK_CB == null) {
        fPREVIEW_NEWLINK_CB = new FPREVIEW_NEWLINK_CB();
    }
    System.arraycopy(propertiesUtil.readValue("SmsServerListenIP").getBytes(), 0, struPreviewListen.struIPAdress.szIP, 0, propertiesUtil.readValue("SmsServerListenIP").length());
    struPreviewListen.struIPAdress.wPort = Short.parseShort(propertiesUtil.readValue("SmsServerListenPort"));
    struPreviewListen.fnNewLinkCB = fPREVIEW_NEWLINK_CB;
    struPreviewListen.pUser = null;
    struPreviewListen.byLinkMode = 1;
    struPreviewListen.write();

    if (StreamHandle < 0) {
        StreamHandle = hCEhomeStream.NET_ESTREAM_StartListenPreview(struPreviewListen);
        if (StreamHandle == -1) {
            System.out.println("NET_ESTREAM_StartListenPreview failed, error code:" + hCEhomeStream.NET_ESTREAM_GetLastError());
            hCEhomeStream.NET_ESTREAM_Fini();
            return;
        } else {
            String StreamListenInfo = new String(struPreviewListen.struIPAdress.szIP).trim() + "_" + struPreviewListen.struIPAdress.wPort;
            System.out.println("流媒体服务:" + StreamListenInfo + ",NET_ESTREAM_StartListenPreview succeed");
        }
    }
}

// check if the callback function throws trigger
public boolean invoke(int lLinkHandle, NET_EHOME_NEWLINK_CB_MSG pNewLinkCBMsg, Pointer pUserData) {
    System.out.println("FPREVIEW_NEWLINK_CB callback");
    log.info("FPREVIEW_NEWLINK_CB callback");
    lPreviewHandle = lLinkHandle;
    System.out.println("lLinkHandle: " + lLinkHandle);
    System.out.println("pNewLinkCBMsg.dwCmdType: " + pNewLinkCBMsg.dwCmdType);
    System.out.println("pNewLinkCBMsg.byRes1: " + pNewLinkCBMsg.byRes1);
    System.out.println("pNewLinkCBMsg.byRes2: " + pNewLinkCBMsg.byRes2);
    System.out.println("pNewLinkCBMsg.struLinkInfo.dwIP: " + pNewLinkCBMsg.struLinkInfo.dwIP);
    System.out.println("pNewLinkCBMsg.struLinkInfo.wPort: " + pNewLinkCBMsg.struLinkInfo.wPort);
    HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM struDataCB = new HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM();
    if (fPREVIEW_DATA_CB == null) {
        fPREVIEW_DATA_CB = new FPREVIEW_DATA_CB();
    }   
    struDataCB.fnPreviewDataCB = fPREVIEW_DATA_CB;

    if(!hCEhomeStream.NET_ESTREAM_SetPreviewDataCB(lLinkHandle, struDataCB)){
        System.out.println("NET_ESTREAM_SetPreviewDataCB failed err::" + hCEhomeStream.NET_ESTREAM_GetLastError());
        return false;
    }
    return true;
}

建议采用以上方法进行定位和调试,希望能解决你的问题。
如果我的回答解决了您的问题,请采纳!

根据代码和问题描述,可以初步判断问题出在预览监听回调函数(FPREVIEW_NEWLINK_CB)没有被调用。可能的原因包括:
1. 预览监听没有成功启动,导致回调函数没有被触发。
2. 回调函数注册不正确,导致回调函数没有被正确调用。
针对这两个可能的原因,可以分别进行排查:
1. 预览监听没有成功启动
可以检查以下几个方面:
- 确认网络连接正常,流媒体服务器能够正常访问。
- 检查代码中的IP地址和端口号是否正确,是否与流媒体服务器的监听地址和端口号一致。
- 检查是否有其他程序占用了监听端口,导致监听失败。
- 检查是否有防火墙或安全策略阻止了程序的网络访问。
2. 回调函数注册不正确
可以检查以下几个方面:
- 确认回调函数的接口和参数与SDK要求的一致。
- 检查回调函数是否被正确地注册到了预览监听中。
- 检查回调函数的实现是否正确,是否有语法错误或逻辑错误。
- 检查回调函数是否被正确地调用,是否有其他程序或线程占用了CPU资源,导致回调函数无法被及时调用。
针对以上问题,可以采取以下措施:
- 确认网络连接正常,流媒体服务器能够正常访问。可以使用ping命令或telnet命令测试网络连接是否正常。
- 检查代码中的IP地址和端口号是否正确,是否与流媒体服务器的监听地址和端口号一致。可以在代码中添加日志输出,确认代码中的IP地址和端口号是否正确。
- 检查是否有其他程序占用了监听端口,导致监听失败。可以使用netstat命令或lsof命令查看端口占用情况。
- 检查是否有防火墙或安全策略阻止了程序的网络访问。可以关闭防火墙或修改安全策略,测试程序是否能够正常访问网络。
- 确认回调函数的接口和参数与SDK要求的一致。可以查阅SDK文档,确认回调函数的接口和参数是否正确。
- 检查回调函数是否被正确地注册到了预览监听中。可以在代码中添加日志输出,确认回调函数是否被正确地注册到了预览监听中。
- 检查回调函数的实现是否正确,是否有语法错误或逻辑错误。可以仔细检查回调函数的代码,确认是否有语法错误或逻辑错误。
- 检查回调函数是否被正确地调用,是否有其他程序或线程占用了CPU资源,导致回调函数无法被及时调用。可以使用调试工具或日志输出,确认回调函数是否被正确地调用,是否有其他程序或线程占用了CPU资源。