Android服务器怎么实现so文件调用


本文小编为大家详细介绍“Android服务器怎么实现so文件调用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android服务器怎么实现so文件调用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。native 层的开发就是通指的 JNI/NDK 开发,通过 JNI 可以实现 java 层和 native 层(主要是 C/C++ )的相互调用,native 层经编译后产生 so 动态链接库,so 文件具有可移植性广,执行效率高,保密性强等优点。那么问题来了,如何调用 so 文件显得异常重要,当然你也可以直接分析 so 文件的伪代码,利用强悍的编程功底直接模拟关键操作,但是我想对于普通人来说头发还是比较重要的。当前调用 so 文件的主流操作应该是:1,基于 Unicorn 的各种实现(还在学习中,暂且不表) 2,Android 服务器的搭建,在 App 内起 http 服务完成调用 so 的需求(当然前提是过了 so 的效验等操作)至于为什么选用 AndServer,好吧,不为什么,只是因为搜索到了它 为什么结合 Service,在学习 Android 开发的时候了解到了 Service 的生命周期,个人理解用 Service 去创建 Http 服务比较好。当然也有 Application 的简单使用,因为在正式环境中,大多数 so 文件的逻辑中都有 context 的一些包名了,签名了的效验等,自定义 Application 的话获取 context 传参就好了。这是我编译好的一个 so 文件,就是根据入参做下简单的字符串拼接(以下是 native 层编译前的 c 代码)这部分代码还是有必要贴一下的,简单的静态注册使用了反射的思想,反射在逆向中至关重要接下来是 java 代码,定义了 native 函数如果到这里有点懵逼的同学可能需要去补下 Android 开发基础了先说下我的环境,因为这个环境影响太大了 1,AndroidStudio 3.4 2,手机 Android 6 架构 armeabi-v7a 打开 AndroidStudio 新建 project cdn.nlark.com/yuque/0/2020/webp/97322/1607479407035-f0bfc349-9792-4b75-be4b-0b2c52f2cabc.webp?x-oss-process=image/watermark,type_d3F5LW1pY3JvaGVp,size_10,text_dGl0b2RhdGEuY29t,color_FFFFFF,shadow_50,t_80,g_se,x_10,y_10″>在 module 的 build 中加这么一句,然后 sync 把编译好的 so 文件复制到 libs 文件夹下(和刚才的 jniLibs.srcDirs 对应) 把 so 对应的 java 代码也 copy 过来,注意包名类名的一致性 打开 activity_main.xml 文件为 TextView 添加 id 打开 MainActiviy.java 开始编码 这两行的意思就是,先从布局中找到对应 id 的 TextView,然后为其设置 Text(调用 native 函数的返回值) 下面测试一下咱们的 so 调用情况 可以看到咱们的 so 文件调用成功(这里咱们的 so 没有效验,只是测试 app 是否可以正常调用)AndServer 官方文档:https://yanzhenjie.com/AndServer/ 打开官方文档,看看人家的入门介绍,新建 java 文件 如图经典 MVC 的 C 就写好了,定义了一个 nightteam_sign 接口,请求方式为 get,请求参数为 sign,调用 native 函数,然后返回 json,但是这里我想利用 Application 获取下 context 对象,取下包名,接下来自定义 Applictaion然后在 manifest 文件中指定要启动的 Application 然后修改 MyController.java 的代码 接下来把官方文档-服务器的代码 copy 下来 导入一些包,修改部分代码如下 新版本的 AndServer.serverBuilder 已经需要传递 context 了,这里把网络地址和端口号也修改为从构造参数中获取,到这里 AndServer 的东西基本完了,实际上咱们就搭建一个调 so 的接口,并没有过多的业务逻辑,所以代码就是使用的最简单的咱们这里用按钮的点击事件启动 Service,故在 activity_main.xml 中添加一个 button 并指定点击事件 接下来编写自定义 Service 代码打上了几个 log,在子线程中启动 AndServer 的服务(何时使用 UI 线程和子线程是 Android 基础,这里就不赘述了) 注意一下,这里从 0.0.0.0 获取 inetAddress,可不要写错了,localhost 和 0.0.0.0 的区别请移步搜索引擎 然后就是向 ServerManager 的构造函数传递 context,inetAddress,port 用来 new 对象,随后开启服务最后注意检查下 manifest 文件中 Service 的声明 回到我们的 MainActivity.java 的 operate( button 的点击事件)编写启动 Service 代码到这里我们的服务基本搭建好了,但是为了方便起见,我想把咱们的本机 ip 显示在 App 上,这样我们就不用去设置再查看了 我在网上找到了一个获取 ip 地址的一个工具类,源码如下:把工具类 copy 到我们的 Android 项目中,继续在 MainActivity.java 中编码 获取了一下本机地址和 Android SDK 版本( Android 8 之后启动 Service 方式不一样)最后一步就是为 app 申请网络权限了 随后连接我们的手机,运行项目,测试一下,点击开启服务 看下 AndroidStudio 日志 好像一切正常,在浏览器访问下试试( ip 就是 App 中显示的 ip 地址) 如图正常访问到了我们想要的内容回过头来说下 Service,打开我们手机的设置,找到应用程序管理-运行中的服务(手机不同 香港云主机,方式不同)可以看到我们的程序,运行了一个服务,这个服务就是咱们编码的 MyService接下来杀掉该 App进程,再次查看运行中的服务读到这里,这篇“Android服务器怎么实现so文件调用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注开发云行业资讯频道。

相关推荐: 怎么修改Docker默认镜像和容器存储位置

本篇内容主要讲解“怎么修改Docker默认镜像和容器存储位置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么修改Docker默认镜像和容器存储位置”吧!一、whydocker默认的镜像和容器存储位置在/var/l…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/13 22:17
下一篇 07/13 22:18

相关推荐