高级语言调用C接口(二)回调函数(1)

前言

先说一下上一篇文章给出了各高级语言类型和C类型的对应关系,只包含基本类型,不包含结构体等复杂结构,高级语言只有常见的JAVA(Android通用)、C#、Python、Arkts(鸿蒙系)。其它语言如delphi、PB之类的古老语言目前使用的人非常稀少,默认不写了;还有js调用需要编译位wasm,但限制非常多,极度不推荐去这样做,可以开发成插件来使用http(s)/ws(s)协议来实现,而且跨平台更加容易。

正文

接下来开始今天要说的内容吧,C语言开发里回调函数是非常常见的,但对于其它高级语言来说,相对使用就没有那么频繁了,但如果有调用C接口的需求,回调也是无法避免的。第一篇先说一下简单的回调,主要是参数的复杂程度,后面会有更复杂的接口调用示例。

C接口定义及调用

先来看一下C接口的定义,这个回调比较简单,参数只有一个const char*

#ifdef _WINDOWS
#define MYAPI _declspec(dllexport)
#else
#define MYAPI
#endif

#ifdef __cplusplus 
extern "C" {
#endif
    typedef void(*PushMessage)(const char* error);//消息回调函数

    int MYAPI Init(
        PushMessage pushMsg,
        const char* licensePath,
        int enAutoUpdateTmpl,
        int enWriteLog);

#ifdef __cplusplus
}
#endif

这里是初始化SDK,并设置消息推送的回调函数,C语言的调用方式比较简单

void ShowMsg(SD_CONST_STRING error)
{
  printf("%s\n", error);
}

int iRet = Init(ShowMsg, "test.dat", 1, 1);
if(iRet == 0)
{
  //to do sth;
}
else
{
  //to do sth;
}

Java接口定义及调用

Java调用C接口有2种方式,Jni和Jna,Jni需要编写C层代码,运行的适应率更高,包括一些ZF、JF的SM机都可以正常运行,Jna由于运行时需要在临时目录下解压jar包,可能会有权限问题。Jna的优势在于支持指针、结构体等复杂类型,传参时可以传递地址,避免内存使用量翻倍。可以说是各有利弊吧,总体感觉还是Jna更方便,代码里更小,与C接口对接也更容易,如果客户不是用的SM机,建议首选Jna。

Jna

定义接口及回调

public interface MYAPI extends Library
{
    MYAPI instanceDll = (MYAPI) Native.load("MYAPI", MYAPI.class);
    //消息回调函数
    public interface CommCallBack extends Callback 
    {
        public void  methodWithCallback(final String mes);
    }
    int  Init(CommCallBack pushMsg,final String licensePath, int enAutoUpdateTmpl,int enWriteLog);
}

调用示例

1、实现CommCallBack

    static public class CommCallBackImpl  implements MYAPI.CommCallBack
    {
       public  void methodWithCallback(final String mes) 
       {
           System.out.printf("%s\n",mes);
       }
    } 

2、实例化并传参

static MYAPI.CommCallBack ShowMsg = new Co

你可能感兴趣的:(高级语言调用C接口的总结,c语言,开发语言,java,c#,python,c++,harmonyos)