jni中的进程通讯的另一种实现方式

在adb shell中执行ps命令常看到后台进程,这些后台进程很多都是在JNI层创建的,并非普通的Android进程,那么问题来了,如何让进程通讯呢?


方式有很多种。

1. 创建socket进行通讯,“127.0.0.1”+ 特定的端口号。这种方式很常用。

2. 管道,父进程和子进程是可以通过管道来读写数据的。这个比较常用。

3. 直接写入特定的文件,这也是本博文要介绍的一种实现,这个估计用的很少,但是在某些情况下使用很有意思,尤其是对主进程来说,只需要写入文件。


Android是从Linux上修改过来的,Linux上不少api也是能够直接在Android上使用的,inotify就是其中一个,用于监控文件系统中的事件。当子进程监控特定的文件,父进程写入该文件时,子进程是能获取到该文件被修改的事件的,也就能直接读取文件中的内容了。以下是代码片段

size_t readBytes = read(fileDescriptor, p_buf, EVENT_BUF_LEN);
int k = 0;
while (k < readBytes){
   struct inotify_event *event = ( struct inotify_event * )(p_buf + k);
   if (event->len > 0){
        kesyPrintf("event.name=%s\n", event->name);
   }

   // print mask
   kesyPrintf("mask=0x%x, wd=%d\n", event->mask, event->wd);
   
   ...
   
   if (event->wd == wdAccount){
        if (IN_CLOSE_WRITE & event->mask > 0){
             kesyPrintf("AccountInfo change detected!!!");
             
             // read account info
             FILE *f = fopen(gAccountPath, "r");
             if (f != NULL){
                  char buf[ANDROID_MAX_PATH];
                  if (NULL != fgets(buf, ANDROID_MAX_PATH, f)){
                       kesyPrintf("AccountInfo changed:");
                       kesyPrintf("%s", buf);
                       strcpy(gUrl, buf);
                  }
                  else{
                       kesyPrintf("failed to read url\n");
                       printerr();
                  }
                  fclose(f);
             }
             else{
                  kesyPrintf("failed to open file accountInfo\n");
             }
        }
        
        if (IN_DELETE_SELF & event->mask > 0){
             kesyPrintf("urlFoo is deleted");
        }
   }
   
   ...
   
   k += EVENT_SIZE + event->len;
}

inotify_rm_watch(fileDescriptor, wdAccount);
close(fileDescriptor);



-------欢迎吐槽

-----------by jacksonke


转载于:https://my.oschina.net/u/1445604/blog/496415

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值