NanoMsg框架|Android Studio编译NanoMsg源码

2020-02-25 15:12:35 浏览数 (1)

导语

前面的章节已经把NanoMsg的简介,及C#相关的NNanoMsg使用Demo已经介绍完成了,今天这篇开始我们就要写关于Android怎么使用NanoMsg的文章,自己在网上搜了好久,发现Android中并没有已经封装好的NanoMsg的好用的包,所以我们就只能自己来实现了,相比C#中要麻烦的多。

Android实现NanoMsg方式

实现步骤

  1. 下载NanoMsg的源码,利用NDK的方式编译源码生成对应的动态链接库(.so)文件。
  2. 在NDK项目中,我们通过C 调用编译好的NanoMsg的动态库,再利用JNI的方式JAVA或是Kotlin进行调用。

其实上面两步可以在一个NDK项目中实现,不过我采用的还是先编译好NanoMsg的动态库方式,如果说NanoMsg本身更新了,这样我们重橷编译一下新的源码生成相同名称的动态库即可,封装调用JNI这些就不用再动代码了。

NanoMsg代码编译

微卡智享

Android的NDK使用

前面的在Android Studio中使用NDK,可以参考我以前的文章《Android NDK编程(一)---NDK介绍及环境搭建》

01

下载源码

NanoMsg的源码地址:https://github.com/nanomsg/nanomsg.git

我们下载解压后在本地

02

新建NDK项目

打开Android Studio新创建一个C 的项目,起名为makenanomsglib

创建好后的项目我们可以看到左边会有CPP的文件夹和里面的CMakeLists.txt的文件

03

复制源码

找到项目CPP文件夹的目录,我们需要把下载完的NanoMsg的源码复制进CPP的文件夹中。

04

修改CMakeLists文件

这一步是一个重点,在NanoMsg中的源码里有一个CMakiList的文件,我们如果直接拷过来替换自己的CMakeList是没用的,而且我们是要编译成动态库,所以里面部分内容我们需要引用,然后自己修改一下。

首先用到的就是设置所有NanoMsg的相关C的文件,把这个整个复制过来,但是因为我们拷贝的路径是在src下,所以根据我们自己的Cmakelist我们的路径前面都要加上src,如下

再看看NanoMsg本身的CmakeList中,下面这块是所对应的系统的,这样我们就不需要考虑这块了

再下面我们看到他有判断NN_HAVE_EPOLL的,其实这个就是我们要定义的CFlag,这块在源码中有看到,但是还没理解,所以我们这块直接在我们的CMakeList中定义,定义的方法就像下图中的add_definitions(-XXXXX)

把这几个修改一下在我们的CMakelist中加入,记得要加入前面的src/

再下面这块与上面的处理一样

我们改完后的效果是

到这里原来NanoMsg中Cmakelist我们需要用到的就可以了,接下来我们要修改自己的CMakelist后面的,比例生成的动态库名什么的这些了

然后下面的链接动态库这里我们也把需要链接库中也改为我们刚才定义的nanomsg的动态库名

基本这样就差不多了,接下来我们编译一下看看,其实写这个文章之前我已经编译成功了一次,再重建这个主要是为了把过程中遇到的问题再重新走一遍,这样记忆更深,接下来我们编译一下看看。

编译过程中的问题

微卡智享

Rebuild Project后直接报了个错

选择File---Project structure,然后在SDK Location中把Android NDK Location选择好我们自己已经下载好的NDK

设置好后我们重新编译,结果还是这个问题,然后我就看了一下build.gradle中cmake的设置,可能我自己机器装了Cmake3.10的版本,所在这里面有一个版本号的问题,网上查了一下说是Android中编译这个用3.6以上的版本会有问题,所以我们把这行删除了后再编译

删除后重新编译完后就不报刚才的问题了,不过又出现了新的问题

no member named 'msg_accrights' in 'struct msghdr'

在网上找了一下资料,发现是socket.h中本身的结构体的定义,应该是版本不同的引的的也不一样了,我们需要加上一个CFlag的定义

代码语言:javascript复制
#设置socket.h中的结构体定义,如果没有这个提cmake中一直会报错
add_definitions (-DNN_HAVE_MSG_CONTROL)

这样我们再重新Make Project就完全成功了

最后要编译一下动态库,选择Build--Build Bundle(s)/APK(s)--Build APK(s)

生成后的动态库就在appbuildintermediatescmakedebugobj下面,对应着不同的处理器架构

这样我们NanoMsg源码编译的动态库就完成了,照着上面的顺序做应该是没有问题的,看着还是挺简单的,不过因为我也是初学者,所以花了我大约三天的时间才搞明白这块,不过总算是有收获的。

后面文章我们介绍一下C下面的Nano的相关函数和Android的调用与前面C#的通讯。

最近还是会把相关的Demo上传上来,敬请期待!

0 人点赞