JNA回调

使用JNA可以简单实现java调用C程序,以及C程序回调java程序。

编写一个C程序

   

#include "stdio.h"
#include "string.h"
#include "sys/socket.h"
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>

static int (*AddByCallback)(void *arg)=NULL;

/*注册回调*/
void RegisterAdd(int (*callback)(char*)){
    AddByCallback = callback;

    pthread_t ntid;

    int err = pthread_create(&ntid,NULL,udpServer,NULL);
    printf("this is C program: can't create thread\n");
}

void *udpServer(void *arg){

    int socket_desc;
    struct sockaddr_in server_addr,client_addr;
    char  server_message[100],client_message[100];

    memset(server_message,0,sizeof(server_message));
    memset(client_message,0,sizeof(client_message));

    socket_desc = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

    if(socket_desc < 0){
        printf("Error while createing socket\n");
        return -1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port =htons(2000);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if(bind(socket_desc,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0){
        printf("Couldn't bind to the port\n");
        return -1;
    }

    printf("Done with binding\n");

    while(1){
        if(recvfrom(socket_desc,client_message,sizeof(client_message),0,(struct sockaddr*)&client_addr,&client_struct_length) < 0){
            printf("Couldn't receive\n");
            return -1;
        }

         printf("Msg from client: %s\n",client_message);
  
         /*接收消息回调到java进行业务处理*/
         int ret = AddByCallback(client_message);
         printf("this is C Program ret = [ %d ]\n",ret);
    }

     close(socket_desc);
     return 0;
}

把C程序编译成so

     gcc  -fpic  -c MySo.c

     gcc  -shared -o  libMySo.so MySo.o

把编译的so放到/home/lib下

编写Java程序

public interface MySo extends Library{

    MySo myso = (MySo)Native.loadLibrary("MySo",MySo.class);

    interface JavaCallbackAdd extends Callback{
        int CallbackAdd(String rec);
    }

    void RegisterAdd(JavaCallbackAdd callback);
    //void DoAddByCallback(int a,int b);
}
public class main{

    public static void main(String[] args){
        MySo.JavaCallbackAdd callback = new MySo.JavaCallbackAdd(){
            @Override
            public int CallbackAdd(String rec){
                System.out.println("-->this is Java CallbackAdd() rec :"+rec);
                return 0;
            }
        };

        /*注册回调*/
        MySo.myso.RegisterAdd(callback);
        while(1){
             try{
                 Thread.sleep(100);
             }catch(){
                 e.printStackTrace();
             }
        }
    }

}

编译

        

在Environment variables中需要设定so所在目录,否则,运行会提示找不到libMySo.so

引入包

    使用JNA需要引入包如下:

<dependency>
    <groupId>com.sun.jna</groupId>
    <artifactId>jna</artifactId>
    <version>3.0.9</version>
</dependency>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ware_soft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值