亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > libffi-devel詳解

libffi-devel詳解

來源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-11-23 16:40:27 1700728827

一、介紹

libffi是一個(gè)C語言庫,它提供了一些接口函數(shù),使得在C語言中調(diào)用其他語言的代碼成為可能。要實(shí)現(xiàn)這一功能,libffi主要提供了以下幾個(gè)接口函數(shù):


/* 用于獲取一個(gè)函數(shù)指針 */
void *ffi_prep_closure_loc(ffi_closure *closure,
                            ffi_cif *cif,
                            void (*fun)(ffi_cif*,void*,void**,void*),
                            void *user_data,
                            void *codeloc);

/* 用于設(shè)置外部函數(shù)的參數(shù)和返回值 */
void ffi_call(ffi_cif *cif,
              void (*fn)(void), /* 被調(diào)用的外部函數(shù) */
              void *rvalue,
              void **avalue);

/* 用于分配和釋放CIF描述符 */
ffi_status ffi_prep_cif(ffi_cif *cif,
                        ffi_abi abi,
                        unsigned int nargs,
                        ffi_type *rtype,
                        ffi_type **atypes);

void ffi_free_cif(ffi_cif *cif);

二、應(yīng)用

下面我們介紹一些在實(shí)際開發(fā)中可能用到的使用libffi的場(chǎng)景。

1. 在C語言中調(diào)用Python代碼

可以使用libffi來調(diào)用Python代碼中的函數(shù)。假設(shè)Python代碼中定義了如下函數(shù):


def add(a, b):
    return a + b

可以通過以下方式在C語言中調(diào)用這個(gè)函數(shù):


#include 
#include 
#include 

int main() {
    Py_Initialize();

    /* 獲取Python模塊和函數(shù)對(duì)象 */
    PyObject *module = PyImport_ImportModule("test");
    PyObject *func = PyObject_GetAttrString(module, "add");

    /* 定義函數(shù)參數(shù)類型 */
    ffi_type *arg_types[2] = {&ffi_type_sint, &ffi_type_sint};
    ffi_cif cif;
    ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, arg_types);

    /* 準(zhǔn)備參數(shù) */
    int a = 1, b = 2;
    void *args[2] = {&a, &b};

    /* 調(diào)用函數(shù) */
    int result;
    ffi_call(&cif, FFI_FN(func), &result, args);

    /* 打印結(jié)果 */
    printf("%d\n", result);

    Py_Finalize();
    return 0;
}

2. 在C語言中調(diào)用Java代碼

如果需要在C語言中調(diào)用Java代碼,可以使用JNI進(jìn)行實(shí)現(xiàn)。但是在某些場(chǎng)景下,可能需要?jiǎng)討B(tài)加載Java類并調(diào)用其中的方法。這時(shí)可以使用libffi來實(shí)現(xiàn)。假設(shè)有一個(gè)Java類:


public class Test {
    public static int add(int a, int b) {
        return a + b;
    }
}

可以通過以下方式在C語言中動(dòng)態(tài)加載這個(gè)Java類并調(diào)用其中的方法:


#include 
#include 
#include 
#include 

int main() {
    void *libjvm = dlopen("/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so", RTLD_LAZY);
    if (!libjvm) {
        printf("Failed to load jvm\n");
        return 1;
    }

    int (*JNI_CreateJavaVM)(JavaVM **pvm, JNIEnv **env, void *vm_args) = dlsym(libjvm, "JNI_CreateJavaVM");
    if (!JNI_CreateJavaVM) {
        printf("Failed to locate JNI_CreateJavaVM\n");
        return 1;
    }

    JavaVM *jvm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
    options[0].optionString = "-Djava.class.path=" "/path/to/test.jar";
    vm_args.version = JNI_VERSION_1_8;
    vm_args.nOptions = 1;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = JNI_FALSE;
    JNI_CreateJavaVM(&jvm, &env, &vm_args);

    /* 獲取Test類和add方法 */
    jclass cls = (*env)->FindClass(env, "Test");
    jmethodID mid = (*env)->GetStaticMethodID(env, cls, "add", "(II)I");

    /* 定義函數(shù)參數(shù)類型 */
    ffi_type *arg_types[2] = {&ffi_type_sint, &ffi_type_sint};
    ffi_cif cif;
    ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, arg_types);

    /* 準(zhǔn)備參數(shù) */
    int a = 1, b = 2;
    void *args[2] = {&a, &b};

    /* 調(diào)用函數(shù) */
    int result;
    ffi_call(&cif, FFI_FN(mid), &result, args);

    /* 打印結(jié)果 */
    printf("%d\n", result);

    (*jvm)->DestroyJavaVM(jvm);

    return 0;
}

3. 動(dòng)態(tài)調(diào)用外部函數(shù)

有時(shí)候需要在程序運(yùn)行時(shí)動(dòng)態(tài)地加載某個(gè)共享庫并調(diào)用其中的函數(shù)。可以使用libffi來實(shí)現(xiàn)這一功能。假設(shè)有如下共享庫:


#include 

void add(int a, int b) {
    printf("%d\n", a + b);
}

可以通過以下方式在C語言中動(dòng)態(tài)加載這個(gè)共享庫并調(diào)用其中的函數(shù):


#include 
#include 
#include 

int main() {
    void *lib = dlopen("/path/to/libadd.so", RTLD_LAZY);
    if (!lib) {
        printf("Failed to load libadd.so\n");
        return 1;
    }

    /* 獲取add函數(shù) */
    void (*add_func)(int, int) = dlsym(lib, "add");
    if (!add_func) {
        printf("Failed to locate add function\n");
        return 1;
    }

    /* 定義函數(shù)參數(shù)類型 */
    ffi_type *arg_types[2] = {&ffi_type_sint, &ffi_type_sint};
    ffi_cif cif;
    ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_void, arg_types);

    /* 準(zhǔn)備參數(shù) */
    int a = 1, b = 2;
    void *args[2] = {&a, &b};

    /* 調(diào)用函數(shù) */
    ffi_call(&cif, FFI_FN(add_func), NULL, args);

    dlclose(lib);

    return 0;
}

三、使用建議

使用libffi需要對(duì)目標(biāo)函數(shù)/方法的參數(shù)和返回值類型進(jìn)行準(zhǔn)確的描述,并且需要確保函數(shù)指針和參數(shù)列表匹配。因此,在使用libffi進(jìn)行開發(fā)時(shí),建議在代碼中增加必要的注釋,以方便后續(xù)維護(hù)。

四、總結(jié)

本文介紹了libffi的實(shí)現(xiàn)原理和應(yīng)用,包括在C語言中調(diào)用Python代碼、在C語言中調(diào)用Java代碼、動(dòng)態(tài)調(diào)用外部函數(shù)等多個(gè)方面。建議在使用libffi進(jìn)行開發(fā)時(shí),增加必要的注釋,以方便后續(xù)維護(hù)。

tags: libffi-devel
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
AV区无码字幕中文色| 亚洲AV永久无码精品网址| 午夜精品四季AV日日骚| 亚洲国产精品久久久久婷婷软件 | 亚洲一区二区女搞男| 67194熟妇在线观看线路| 从今天开始当城主| 狠狠色综合网站久久久久久久| 老狼一区忘忧草欢迎您大豆男男| 人妻有码中文字幕| 亚洲AV伊人久久青青草原视色| 18禁动漫无码无遮挡免费看| 国产AV剧情MD精品麻豆| 久久精品国产自在天天线| 人妻少妇精品无码专区动漫| 亚洲AV福利天堂在线观看| 18禁裸乳无遮挡啪啪无码免费| 国产成人精品久久| 久久丫线这里只精品| 日韩人妻高清精品专区| 亚洲精品无码AV片| 帮妺妺洗澡忍不住C了她作文| 国产又色又刺激高潮免费视频试看| 蜜桃AV一区二区三区| 深夜成人毛片天堂| 影音先锋人妻啪啪AV资源网站| 儿子比老公更大更硬朗| 久久久久久久久精品中文字幕 | 国产精品青草久久福利不卡| 老熟妇一区二区三区啪啪| 少妇呻吟翘臀后进爆白浆| 亚洲中文字幕精品一区二区三区| 从厨房一路顶撞到卧室门好吗| 精品国产制服丝袜高跟| 日韩AV无码午夜免费福利制服| 亚洲精品白浆高清久久久久久| а√在线中文网新版地址在线| 饥渴人妻被快递员玩弄视频 | 才摸两下小奶头就受不了了| 精产国品一二三产区区別| 日本精品一区二区三区试看| 亚洲色欲综合一区二区三区小说| 大陆少妇XXXX做受| 麻豆精品传媒一二三区| 无码中文国产不卡视频| JEALOUSVUE成熟MON| 精品人妻一区二区三区视频53一 | 亚洲午夜性春猛交XXXX偷窥| 粉嫩av一区二区精品爆乳| 狂躁美女BBBBBB视频| 无套内内射视频网站| JZZIJZZIJ日本成熟少妇| 久久99精品久久久久久动态图 | 农村野外性BBW| 亚洲国产精品无码久久一线| 丰满少妇A级毛片| 免费国产成人AⅤ观看| 亚洲成人av在线| 国产99久久久久久免费看| 女人18毛片A级毛片视频| 亚洲V欧美V国产V在线观看| 丁香婷婷激情俺也去俺来也 | 99精产国品一二三产区区别在线| 饥渴人妻精油按摩无码专区| 天美传媒MV在线播放高清视频| BIGBANG幼稚视频入门幼年| 久久大香香蕉国产拍国| 五十路○の豊満な肉体| 成人AV片无码免费网站| 免费观看无遮挡WWW的视频| 亚洲精品无码久久久久去Q| 国产激情久久久久影院老熟女| 人妻丝袜另类欧美偷拍视频| 中文字幕乱近親相姦| 精品国产免费人成网站| 无遮挡无码H纯肉动漫在线观看| 菠萝蜜视频网在线WWW| 女人被狂C到高潮视频网站| 亚洲综合无码一区二区三区| 国色天香精品卡一卡二卡三二百 | 在线欧美熟妇内射高潮| 精品久久久无码中文字幕| 性色AV免费观看| 国产成人精品免高潮在线观看| 日本XXXXXXXXX69| ASS年轻少妇BBWPIC精品| 里面也请好好疼爱第三季| 亚洲精品又大又粗| 国内美女推油按摩在线播放| 无码人妻一区二区三区免费看成人 | 欧美日韩一区二区综合| 最新精品国偷自产在线下载| 久久久久久精品免费免费软件| 亚洲国产A∨无码中文777| 国产无人区码SUV| 无码人妻AⅤ一区二区三区夏目| 丰满人妻被粗大爽ⅩXOO| 日本免码VA在线看免费最新| GAY片男同网站WWW| 女的把腿张开男的往里面插| 中日韩人妻中文字幕视频在线| 久久人人爽人人爽人人AV东京热| 亚洲日韩乱码中文无码蜜桃臀网站| 国精品99久9在线 | 免费| 学渣含着学霸几巴的写作业视频| 国产乱妇乱子在线播放视频| 无码熟熟妇丰满人妻啪啪软件| 国产精品国产三级国产AV′| 我的妈妈和黑人群交小说| 国产刺激一区二区| 玩弄丰满奶水的女邻居| 国产放荡对白视频在线观看| 乌克兰ZOOMKOOL| 国产欧美亚洲日韩图片| 亚洲AV无码国产精品色午夜软件| 国产中文欧美日韩在线| 亚洲第一狼人伊人AV| 精品综合久久久久久97| 野花高清在线观看免费官网| 久久香综合精品久久伊人| 中文字幕AV一区二区三区| 年轻漂亮的人妻被公侵犯BD免费 | 亚洲精品人妻无码| 精品无码国产污污污在线观看 | 免费观看电视剧全集在线播放| 中文字字幕乱码视频高清| 欧美精产国品一二三类产品| 把腿张开我要CAO死你在线观看| 日本做受高潮好舒服视频| 俄罗斯IPHONE14PRO| 为了升职丈夫把我献给他们领导 | 亚洲AV永久青草无码精品| 极品无码AV国模在线观看| 亚洲综合另类小说色区一| 久久水蜜桃网国产无线网欧美日韩 | 久久99久久99精品中文字幕| 永久黄网站色视频免费品善网| 麻豆人人妻人人妻人人片AV| FREEHDⅩXXXXSEX| 日韩人妻无码系列专区| 国产成人综合一区人人| 亚洲高清国产AV拍精品青青草原| 久久久久亚洲AV片无码下载蜜桃| 337P日本欧洲亚洲大胆张筱雨| 欧美一级 片内射欧美A999| 丰满丝袜熟女HD| 亚洲AV玩弄放荡人妇系列| 精品人妻Av乱码一区二区 | 亚洲日韩中文字幕一区| 蜜桃视频在线观看一区二区三区| XXX少妇厨房XXX乱| 挺进邻居人妻雪白的身体韩国电影| 国产热の有码热の无码视频| 亚洲无人区一码二码三码区别大吗| 免费A级毛片18禁网站APP| 把腿张开老子cao烂你n视频| 无码精品一区二区三区在线| 精品熟女少妇AⅤ免费久久| 做I爱直播APP| 日日摸日日碰夜夜爽97| 国产又粗又猛又爽又黄的视频免费黑人了| 亚洲色成人WWW永久在线观看| 欧产日产国产精品精品| 国产成年无码久久久久下载| 亚洲欧美成人在线观看| 欧美成人v片一区二区三区激情| 丰满熟妇乱子又伦| 亚洲欧美另类久久久精品 | 老妇FREE性VIDEOSXX| 变态SM无码凌虐视频网站| 性少妇VIDEOXXX欧美69| 乱色精品无码一区二区国产盗| 错位关系C1V1一块五花肉| 亚洲AV无码专区国产乱码APP| 免费av网站在线观看| 二虎进入温如玉160章小说| 亚洲精品第一国产综合精品99| 欧美在线三级艳情网站| 国产睡熟迷奷系列网站| 中国熟妇老熟女妓女9| 少妇爆乳无码AV无码专区| 精品无码一区二区三区不卡 | 久久久无码精品午夜| 成人国产一区二区三区精品不卡| 亚洲AV永久无码精品三区在线4 | 低头看我是怎么C哭你的| 亚洲国产精品热久久| 人人妻人人爽人人澡欧美一区| 好爽又高潮了毛片| АⅤ资源中文在线天堂| 亚洲HAIRY多毛PICS大全| 欧美性猛交内射兽交老熟妇| 国产啪精品视频网站免费尤物 | 亚洲色婷婷综合久久| 日本久久久WWW成人免费毛片丨| 护士交换粗吟配乱大交| 爆乳熟妇一区二区三区| 亚洲情A成黄在线观看动漫尤物| 日韩少妇白浆无码系列| 久久精品国产亚洲AV麻豆AⅤ|