linphone-LinphoneFriendImpl文件对应的JNI层文件分析_linphone friendlist-程序员宅基地

技术标签: linphone  

说明

native函数

    private native void finalize(long nativePtr);
    private native long newLinphoneFriend(String friendUri);
    private native void setAddress(long nativePtr,long friend);
    private native long getAddress(long nativePtr);
    private native void setIncSubscribePolicy(long nativePtr,int enumValue);
    private native int  getIncSubscribePolicy(long nativePtr);
    private native void enableSubscribes(long nativePtr,boolean value);
    private native boolean isSubscribesEnabled(long nativePtr);
    private native int getStatus(long nativePtr);
    private native Object getPresenceModel(long nativePtr);
    private native void setPresenceModel(long nativePtr, long presencePtr);
    private native void edit(long nativePtr);
    private native void done(long nativePtr);
    private native Object getCore(long ptr);
    private native void setRefKey(long nativePtr, String key);
    private native String getRefKey(long nativePtr);
    private native void setName(long nativePtr, String name);
    private native String getName(long nativePtr);

具体函数分析

finalize

extern "C" void  Java_org_linphone_core_LinphoneFriendImpl_finalize(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    LinphoneFriend *lfriend=(LinphoneFriend*)ptr;
    linphone_friend_set_user_data(lfriend,NULL);
    linphone_friend_unref(lfriend);
}

LinphoneFriend

submodules/linphone/coreapi/private.h:struct _LinphoneFriend{
   
struct _LinphoneFriend{
    belle_sip_object_t base;
    void *user_data;
    LinphoneAddress *uri;
    MSList *insubs; /*list of SalOp. There can be multiple instances of a same Friend that subscribe to our presence*/
    SalOp *outsub;
    LinphoneSubscribePolicy pol;
    LinphonePresenceModel *presence;
    struct _LinphoneCore *lc;
    BuddyInfo *info;
    char *refkey;
    bool_t subscribe;
    bool_t subscribe_active;
    bool_t inc_subscribe_pending;
    bool_t commit;
    bool_t initial_subscribes_sent; /*used to know if initial subscribe message was sent or not*/
    bool_t presence_received;
    LinphoneVcard *vcard;
    unsigned int storage_id;
    LinphoneFriendList *friend_list;
};

我隐隐约约的明白了, 只要明白LinphoneFriend 就可以明白这个类型是干什么工作的了。

LinphoneSubscribePolicy

submodules/linphone/coreapi/linphonefriend.h:typedef enum _LinphoneSubscribePolicy {
   
/**
 * @addtogroup buddy_list
 * @{
 */
/**
 * Enum controlling behavior for incoming subscription request.
 * <br> Use by linphone_friend_set_inc_subscribe_policy()
 */
typedef enum _LinphoneSubscribePolicy {
    /**
     * Does not automatically accept an incoming subscription request.
     * This policy implies that a decision has to be taken for each incoming subscription request notified by callback LinphoneCoreVTable.new_subscription_requested
     *
     */
    LinphoneSPWait,
    /**
     * Rejects incoming subscription request.
     */
    LinphoneSPDeny,
    /**
     * Automatically accepts a subscription request.
     */
    LinphoneSPAccept
} LinphoneSubscribePolicy;

LinphonePresenceModel

submodules/linphone/coreapi/presence.c:struct _LinphonePresenceModel {
   
/**
 * Represents the presence model as defined in RFC 4479 and RFC 4480.
 * This model is not complete. For example, it does not handle devices.
 */
struct _LinphonePresenceModel {
    LinphoneAddress *presentity; /* "The model seeks to describe the presentity, identified by a presentity URI.*/
    void *user_data;
    int refcnt;
    MSList *services;   /**< A list of _LinphonePresenceService structures. Also named tuples in the RFC. */
    MSList *persons;    /**< A list of _LinphonePresencePerson structures. */
    MSList *notes;      /**< A list of _LinphonePresenceNote structures. */
};

LinphoneVcard

submodules/linphone/coreapi/vcard.cc:struct _LinphoneVcard {
submodules/linphone/coreapi/vcard_stubs.c:struct _LinphoneVcard {
submodules/linphone/coreapi/vcard.h:typedef struct _LinphoneVcard LinphoneVcard;
struct _LinphoneVcard {
    shared_ptr<belcard::BelCard> belCard;
    char *etag;
    char *url;
    unsigned char *md5;
};

LinphoneFriendList

submodules/linphone/coreapi/private.h:struct _LinphoneFriendList {
   
struct _LinphoneFriendList {
    belle_sip_object_t base;
    void *user_data;
    LinphoneCore *lc;
    LinphoneEvent *event;
    char *display_name;
    char *rls_uri;
    MSList *friends;
    unsigned char *content_digest;
    int expected_notification_version;
    unsigned int storage_id;
    char *uri;
    MSList *dirty_friends_to_update;
    int revision;
    LinphoneFriendListCbs *cbs;
};

linphone_friend_set_user_data

submodules/linphone/coreapi/linphonefriend.h:LINPHONE_PUBLIC void linphone_friend_set_user_data(LinphoneFriend *lf, void *data);

submodules/linphone/coreapi/friend.c:void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
   
void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
    lf->user_data=data;
}

linphone_friend_unref

void linphone_friend_unref(LinphoneFriend *lf) {
    belle_sip_object_unref(lf);
}

newLinphoneFriend

//LinphoneFriend
extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_newLinphoneFriend(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jstring jFriendUri) {
    LinphoneFriend* lResult;

    if (jFriendUri) {
        const char* friendUri = env->GetStringUTFChars(jFriendUri, NULL);
        lResult = linphone_friend_new_with_address(friendUri);
        linphone_friend_set_user_data(lResult,env->NewWeakGlobalRef(thiz));
        env->ReleaseStringUTFChars(jFriendUri, friendUri);
    } else {
        lResult = linphone_friend_new();
        linphone_friend_set_user_data(lResult,env->NewWeakGlobalRef(thiz));
    }
    return (jlong)lResult;
}

linphone_friend_set_user_data

submodules/linphone/coreapi/linphonefriend.h:LINPHONE_PUBLIC void linphone_friend_set_user_data(LinphoneFriend *lf, void *data);
submodules/linphone/coreapi/friend.c:void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
   

void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
    lf->user_data=data;
}

setAddress

extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setAddress(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr
                                                                        ,jlong linphoneAddress) {
    linphone_friend_set_address((LinphoneFriend*)ptr,(LinphoneAddress*)linphoneAddress);
}

linphone_friend_set_address

int linphone_friend_set_address(LinphoneFriend *lf, const LinphoneAddress *addr){
    LinphoneAddress *fr = linphone_address_clone(addr);
    LinphoneVcard *vcard = NULL;

    linphone_address_clean(fr);
    if (lf->uri != NULL) linphone_address_unref(lf->uri);
    lf->uri = fr;

    vcard = linphone_friend_get_vcard(lf);
    if (vcard) {
        linphone_vcard_edit_main_sip_address(vcard, linphone_address_as_string_uri_only(fr));
    }

    return 0;
}

linphone_address_clone

submodules/linphone/coreapi/address.c:LinphoneAddress * linphone_address_clone(const LinphoneAddress *addr){
   
/**
 * Clones a LinphoneAddress object.
**/
LinphoneAddress * linphone_address_clone(const LinphoneAddress *addr){
    return sal_address_clone(addr);
}

sal_address_clone

submodules/linphone/coreapi/bellesip_sal/sal_address_impl.c:SalAddress * sal_address_clone(const SalAddress *addr){
   
SalAddress * sal_address_clone(const SalAddress *addr){
    return (SalAddress *) belle_sip_object_ref(belle_sip_object_clone(BELLE_SIP_OBJECT(addr)));
}

linphone_address_clean

submodules/linphone/coreapi/address.c:void linphone_address_clean(LinphoneAddress *uri){
submodules/linphone/coreapi/linphonecore.h:LINPHONE_PUBLIC  void linphone_address_clean(LinphoneAddress *uri);
/**
 * Removes address's tags and uri headers so that it is displayable to the user.
**/
void linphone_address_clean(LinphoneAddress *uri){
    sal_address_clean(uri);
}

linphone_friend_get_vcard

LinphoneVcard* linphone_friend_get_vcard(LinphoneFriend *fr) {
    if (fr) {
        return fr->vcard;
    }
    return NULL;
}

linphone_vcard_edit_main_sip_address

submodules/linphone/coreapi/vcard.cc:void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_address) {
submodules/linphone/coreapi/vcard_stubs.c:void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_address) {
   
void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_address) {
    if (!vCard || !sip_address) return;

    if (vCard->belCard->getImpp().size() > 0) {
        const shared_ptr<belcard::BelCardImpp> impp = vCard->belCard->getImpp().front();
        impp->setValue(sip_address);
    } else {
        shared_ptr<belcard::BelCardImpp> impp = belcard::BelCardGeneric::create<belcard::BelCardImpp>();
        impp->setValue(sip_address);
        vCard->belCard->addImpp(impp);
    }
}

linphone_address_as_string_uri_only

/**
 * Returns the SIP uri only as a string, that is display name is removed.
 * The returned char * must be freed by the application. Use ms_free().
**/
char *linphone_address_as_string_uri_only(const LinphoneAddress *u){
    return sal_address_as_string_uri_only(u);
}

sal_address_as_string_uri_only

char *sal_address_as_string_uri_only(const SalAddress *addr){
    belle_sip_header_address_t* header_addr = BELLE_SIP_HEADER_ADDRESS(addr);
    belle_sip_uri_t* sip_uri = belle_sip_header_address_get_uri(header_addr);
    belle_generic_uri_t* absolute_uri = belle_sip_header_address_get_absolute_uri(header_addr);
    char tmp[1024]={
   0};
    size_t off=0;
    belle_sip_object_t* uri;

    if (sip_uri) {
        uri=(belle_sip_object_t*)sip_uri;
    } else if (absolute_uri) {
        uri=(belle_sip_object_t*)absolute_uri;
    } else {
        ms_error("Cannot generate string for addr [%p] with null uri",addr);
        return NULL;
    }
    belle_sip_object_marshal(uri,tmp,sizeof(tmp),&off);
    return ms_strdup(tmp);
}

getAddress

extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_getAddress(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    return (jlong)linphone_friend_get_address((LinphoneFriend*)ptr);
}

linphone_friend_get_address

const LinphoneAddress *linphone_friend_get_address(const LinphoneFriend *lf){
    return lf->uri;
}

setIncSubscribePolicy

extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setIncSubscribePolicy(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr
                                                                        ,jint policy) {
    linphone_friend_set_inc_subscribe_policy((LinphoneFriend*)ptr,(LinphoneSubscribePolicy)policy);
}

linphone_friend_set_inc_subscribe_policy

int linphone_friend_set_inc_subscribe_policy(LinphoneFriend *fr, LinphoneSubscribePolicy pol) {
    fr->pol=pol;
    return 0;
}

getIncSubscribePolicy

extern "C" jint Java_org_linphone_core_LinphoneFriendImpl_getIncSubscribePolicy(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    return (jint)linphone_friend_get_inc_subscribe_policy((LinphoneFriend*)ptr);
}

linphone_friend_get_inc_subscribe_policy

LinphoneSubscribePolicy linphone_friend_get_inc_subscribe_policy(const LinphoneFriend *lf){
    return lf->pol;
}

enableSubscribes

extern "C" void Java_org_linphone_core_LinphoneFriendImpl_enableSubscribes(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr
                                                                        ,jboolean value) {
    linphone_friend_enable_subscribes((LinphoneFriend*)ptr,value);
}

linphone_friend_enable_subscribes

int linphone_friend_enable_subscribes(LinphoneFriend *fr, bool_t val){
    fr->subscribe=val;
    return 0;
} 

isSubscribesEnabled

extern "C" jboolean Java_org_linphone_core_LinphoneFriendImpl_isSubscribesEnabled(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    return (jboolean)linphone_friend_subscribes_enabled((LinphoneFriend*)ptr);
}

linphone_friend_subscribes_enabled

submodules/linphone/coreapi/linphonefriend.h:LINPHONE_PUBLIC bool_t linphone_friend_subscribes_enabled(const LinphoneFriend *lf);
submodules/linphone/coreapi/linphonefriend.h:#define linphone_friend_get_send_subscribe linphone_friend_subscribes_enabled
submodules/linphone/coreapi/linphonecore_jni.cc:    return (jboolean)linphone_friend_subscribes_enabled((LinphoneFriend*)ptr);

getStatus

extern "C" jint Java_org_linphone_core_LinphoneFriendImpl_getStatus(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    return (jint)linphone_friend_get_status((LinphoneFriend*)ptr);
}
LinphoneOnlineStatus linphone_friend_get_status(const LinphoneFriend *lf){
    LinphoneOnlineStatus online_status = LinphoneStatusOffline;
    LinphonePresenceBasicStatus basic_status = LinphonePresenceBasicStatusClosed;
    LinphonePresenceActivity *activity = NULL;
    unsigned int nb_activities = 0;

    if (lf->presence != NULL) {
        basic_status = linphone_presence_model_get_basic_status(lf->presence);
        nb_activities = linphone_presence_model_get_nb_activities(lf->presence);
        online_status = (basic_status == LinphonePresenceBasicStatusOpen) ? LinphoneStatusOnline : LinphoneStatusOffline;
        if (nb_activities > 1) {
            char *tmp = NULL;
            const LinphoneAddress *addr = linphone_friend_get_address(lf);
            if (addr) tmp = linphone_address_as_string(addr);
            ms_warning("Friend %s has several activities, get status from the first one", tmp ? tmp : "unknown");
            if (tmp) ms_free(tmp);
            nb_activities = 1;
        }
        if (nb_activities == 1) {
            activity = linphone_presence_model_get_activity(lf->presence);
            switch (linphone_presence_activity_get_type(activity)) {
                case LinphonePresenceActivityBreakfast:
                case LinphonePresenceActivityDinner:
                case LinphonePresenceActivityLunch:
                case LinphonePresenceActivityMeal:
                    online_status = LinphoneStatusOutToLunch;
                    break;
                case LinphonePresenceActivityAppointment:
                case LinphonePresenceActivityMeeting:
                case LinphonePresenceActivityPerformance:
                case LinphonePresenceActivityPresentation:
                case LinphonePresenceActivitySpectator:
                case LinphonePresenceActivityWorking:
                case LinphonePresenceActivityWorship:
                    online_status = LinphoneStatusDoNotDisturb;
                    break;
                case LinphonePresenceActivityAway:
                case LinphonePresenceActivitySleeping:
                    online_status = LinphoneStatusAway;
                    break;
                case LinphonePresenceActivityHoliday:
                case LinphonePresenceActivityTravel:
                case LinphonePresenceActivityVacation:
                    online_status = LinphoneStatusVacation;
                    break;
                case LinphonePresenceActivityBusy:
                case LinphonePresenceActivityLookingForWork:
                case LinphonePresenceActivityPlaying:
                case LinphonePresenceActivityShopping:
                case LinphonePresenceActivityTV:
                    online_status = LinphoneStatusBusy;
                    break;
                case LinphonePresenceActivityInTransit:
                case LinphonePresenceActivitySteering:
                    online_status = LinphoneStatusBeRightBack;
                    break;
                case LinphonePresenceActivityOnThePhone:
                    online_status = LinphoneStatusOnThePhone;
                    break;
                case LinphonePresenceActivityOther:
                case LinphonePresenceActivityPermanentAbsence:
                    online_status = LinphoneStatusMoved;
                    break;
                case LinphonePresenceActivityUnknown:
                    /* Rely on the basic status information. */
                    break;
                case LinphonePresenceActivityOnline:
                    /* Should not happen! */
                    /*ms_warning("LinphonePresenceActivityOnline should not happen here!");*/
                    break;
                case LinphonePresenceActivityOffline:
                    online_status = LinphoneStatusOffline;
                    break;
            }
        }
    }

    return online_status;
}

getPresenceModel

/*
 * Class:     org_linphone_core_LinphoneFriendImpl
 * Method:    getPresenceModel
 * Signature: (J)Ljava/lang/Object;
 */
JNIEXPORT jobject JNICALL Java_org_linphone_core_LinphoneFriendImpl_getPresenceModel(JNIEnv *env, jobject jobj, jlong ptr) {
    
    LinphoneFriend *lf = (LinphoneFriend *)ptr;
    LinphonePresenceModel *model = (LinphonePresenceModel *)linphone_friend_get_presence_model(lf);
    if (model == NULL) return NULL;
    RETURN_USER_DATA_OBJECT("PresenceModelImpl", linphone_presence_model, model);
}

linphone_friend_get_presence_model

const LinphonePresenceModel * linphone_friend_get_presence_model(LinphoneFriend *lf) {
    return lf->presence;
}

setPresenceModel

/*
 * Class:     org_linphone_core_LinphoneCoreImpl
 * Method:    setPresenceModel
 * Signature: (JILjava/lang/String;J)V
 */
JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneCoreImpl_setPresenceModel(JNIEnv *env, jobject jobj, jlong ptr, jlong modelPtr) {
    LinphoneCore *lc = (LinphoneCore *)ptr;
    LinphonePresenceModel *model = (LinphonePresenceModel *)modelPtr;
    linphone_core_set_presence_model(lc, model);
}

edit

extern "C" void Java_org_linphone_core_LinphoneFriendImpl_edit(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    return linphone_friend_edit((LinphoneFriend*)ptr);
}

linphone_friend_edit

void linphone_friend_edit(LinphoneFriend *fr) {
    if (fr && fr->vcard) {
        linphone_vcard_compute_md5_hash(fr->vcard);
    }
}

done

extern "C" void Java_org_linphone_core_LinphoneFriendImpl_done(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
     linphone_friend_done((LinphoneFriend*)ptr);
}

linphone_friend_done

void linphone_friend_done(LinphoneFriend *fr) {
    ms_return_if_fail(fr);
    if (!fr->lc || !fr->friend_list) return;
    linphone_friend_apply(fr, fr->lc);
    linphone_friend_save(fr, fr->lc);

    if (fr && fr->vcard) {
        if (linphone_vcard_compare_md5_hash(fr->vcard) != 0) {
            ms_debug("vCard's md5 has changed, mark friend as dirty");
            fr->friend_list->dirty_friends_to_update = ms_list_append(fr->friend_list->dirty_friends_to_update, linphone_friend_ref(fr));
        }
    }
}

getCore

extern "C" jobject Java_org_linphone_core_LinphoneChatRoomImpl_getCore(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong chatroom_ptr){
    
    LinphoneCore *lc=linphone_chat_room_get_core((LinphoneChatRoom*)chatroom_ptr);
    LinphoneJavaBindings *ljb = (LinphoneJavaBindings *)linphone_core_get_user_data(lc);
    jobject core = ljb->getCore();
    return core;
}

setRefKey

extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setRefKey(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr
                                                                        ,jstring jkey) {
    const char* key = env->GetStringUTFChars(jkey, NULL);
    linphone_friend_set_ref_key((LinphoneFriend*)ptr,key);
    env->ReleaseStringUTFChars(jkey, key);
}

linphone_friend_set_ref_key

void linphone_friend_set_ref_key(LinphoneFriend *lf, const char *key){
    if (lf->refkey != NULL) {
        ms_free(lf->refkey);
        lf->refkey = NULL;
    }
    if (key) {
        lf->refkey = ms_strdup(key);
    }
    if (lf->lc) {
        linphone_friend_save(lf, lf->lc);
    }
}

getRefKey

extern "C" jstring Java_org_linphone_core_LinphoneFriendImpl_getRefKey(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    const char * key = linphone_friend_get_ref_key((LinphoneFriend *)ptr);
    return key ? env->NewStringUTF(key) : NULL;
}

setName

extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setName(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr
                                                                        ,jstring jname) {
    const char* name = env->GetStringUTFChars(jname, NULL);
    linphone_friend_set_name((LinphoneFriend*)ptr, name);
    env->ReleaseStringUTFChars(jname, name);
}

getName

extern "C" jstring Java_org_linphone_core_LinphoneFriendImpl_getName(JNIEnv*  env
                                                                        ,jobject  thiz
                                                                        ,jlong ptr) {
    const char *name = linphone_friend_get_name((LinphoneFriend*)ptr);
    return name ? env->NewStringUTF(name) : NULL;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AdrianAndroid/article/details/52135088

智能推荐

2022黑龙江最新建筑八大员(材料员)模拟考试试题及答案_料账的试题-程序员宅基地

文章浏览阅读529次。百分百题库提供建筑八大员(材料员)考试试题、建筑八大员(材料员)考试预测题、建筑八大员(材料员)考试真题、建筑八大员(材料员)证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。310项目经理部应编制机械设备使用计划并报()审批。A监理单位B企业C建设单位D租赁单位答案:B311对技术开发、新技术和新工艺应用等情况进行的分析和评价属于()。A人力资源管理考核B材料管理考核C机械设备管理考核D技术管理考核答案:D312建筑垃圾和渣土._料账的试题

chatgpt赋能python:Python自动打开浏览器的技巧-程序员宅基地

文章浏览阅读614次。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。_python自动打开浏览器

Linux中安装JDK-RPM_linux 安装jdk rpm-程序员宅基地

文章浏览阅读545次。Linux中安装JDK-RPM方式_linux 安装jdk rpm

net高校志愿者管理系统-73371,计算机毕业设计(上万套实战教程,赠送源码)-程序员宅基地

文章浏览阅读25次。免费领取项目源码,请关注赞收藏并私信博主,谢谢-高校志愿者管理系统主要功能模块包括页、个人资料(个人信息。修改密码)、公共管理(轮播图、系统公告)、用户管理(管理员、志愿用户)、信息管理(志愿资讯、资讯分类)、活动分类、志愿活动、报名信息、活动心得、留言反馈,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取SQL Server 作为后台数据的主要存储单元,采用Asp.Net技术进行业务系统的编码及其开发,实现了本系统的全部功能。

小米宣布用鸿蒙了吗,小米OV对于是否采用鸿蒙保持沉默,原因是中国制造需要它们...-程序员宅基地

文章浏览阅读122次。原标题:小米OV对于是否采用鸿蒙保持沉默,原因是中国制造需要它们目前华为已开始对鸿蒙系统大规模宣传,不过中国手机四强中的另外三家小米、OPPO、vivo对于是否采用鸿蒙系统保持沉默,甚至OPPO还因此而闹出了一些风波,对此柏铭科技认为这是因为中国制造当下需要小米OV几家继续将手机出口至海外市场。 2020年中国制造支持中国经济渡过了艰难的一年,这一年中国进出口贸易额保持稳步增长的势头,成为全球唯一..._小米宣布用鸿蒙系统

Kafka Eagle_kafka eagle git-程序员宅基地

文章浏览阅读1.3k次。1.Kafka Eagle实现kafka消息监控的代码细节是什么?2.Kafka owner的组成规则是什么?3.怎样使用SQL进行kafka数据预览?4.Kafka Eagle是否支持多集群监控?1.概述在《Kafka 消息监控 - Kafka Eagle》一文中,简单的介绍了 Kafka Eagle这款监控工具的作用,截图预览,以及使用详情。今天_kafka eagle git

随便推点

Eva.js是什么(互动小游戏开发)-程序员宅基地

文章浏览阅读1.1k次,点赞29次,收藏19次。Eva.js 是一个专注于开发互动游戏项目的前端游戏引擎。:Eva.js 提供开箱即用的游戏组件供开发人员立即使用。是的,它简单而优雅!:Eva.js 由高效的运行时和渲染管道 (Pixi.JS) 提供支持,这使得释放设备的全部潜力成为可能。:得益于 ECS(实体-组件-系统)架构,你可以通过高度可定制的 API 扩展您的需求。唯一的限制是你的想象力!_eva.js

OC学习笔记-Objective-C概述和特点_objective-c特点及应用领域-程序员宅基地

文章浏览阅读1k次。Objective-C概述Objective-C是一种面向对象的计算机语言,1980年代初布莱德.考斯特在其公司Stepstone发明Objective-C,该语言是基于SmallTalk-80。1988年NeXT公司发布了OC,他的开发环境和类库叫NEXTSTEP, 1994年NExt与Sun公司发布了标准的NEXTSTEP系统,取名openStep。1996_objective-c特点及应用领域

STM32学习笔记6:TIM基本介绍_stm32 tim寄存器详解-程序员宅基地

文章浏览阅读955次,点赞20次,收藏16次。TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在 72MHz 计数时钟下可以实现最大 59.65s 的定时,59.65s65536×65536×172MHz59.65s65536×65536×721​MHz不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。_stm32 tim寄存器详解

前端基础语言HTML、CSS 和 JavaScript 学习指南_艾编程学习资料-程序员宅基地

文章浏览阅读1.5k次。对于任何有兴趣学习前端 Web 开发的人来说,了解 HTML、CSS 和JavaScript 之间的区别至关重要。这三种前端语言都是您访问过的每个网站的用户界面构建块。而且,虽然每种语言都有不同的功能重点,但它们都可以共同创建令人兴奋的交互式网站,让用户保持参与。因此,您会发现学习所有三种语言都很重要。如果您有兴趣从事前端开发工作,可以通过多种方式学习这些语言——在艾编程就可以参与到学习当中来。在本文中,我们将回顾每种语言的特征、它们如何协同工作以及您可以在哪里学习它们。HTML vs C._艾编程学习资料

三维重构(10):PCL点云配准_局部点云与全局点云配准-程序员宅基地

文章浏览阅读2.8k次。点云配准主要针对点云的:不完整、旋转错位、平移错位。因此要得到完整点云就需要对局部点云进行配准。为了得到被测物体的完整数据模型,需要确定一个合适的坐标系变换,将从各个视角得到的点集合并到一个统一的坐标系下形成一个完整的数据点云,然后就可以方便地进行可视化,这就是点云数据的配准。点云配准技术通过计算机技术和统计学规律,通过计算机计算两个点云之间的错位,也就是把在不同的坐标系下的得到的点云进行坐标变..._局部点云与全局点云配准

python零基础学习书-Python零基础到进阶必读的书藉:Python学习手册pdf免费下载-程序员宅基地

文章浏览阅读273次。提取码:0oorGoogle和YouTube由于Python的高可适应性、易于维护以及适合于快速开发而采用它。如果你想要编写高质量、高效的并且易于与其他语言和工具集成的代码,《Python学习手册:第4 版》将帮助你使用Python快速实现这一点,不管你是编程新手还是Python初学者。本书是易于掌握和自学的教程,根据作者Python专家Mark Lutz的著名培训课程编写而成。《Python学习..._零基础学pythonpdf电子书