博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
andriod底层最简开发流程
阅读量:7180 次
发布时间:2019-06-29

本文共 1837 字,大约阅读时间需要 6 分钟。

动态jni:

1.java端:

静态初始化块:加载类时就执行,去加载本地库用native 声明本地方法

jni端:

这里面函数和变量的定义规则不同,除了void型,其他记得加j前缀,

JNI_OnLoad()函数,很重要

将jni编译生成动态库:

arm-linux-gnueabi-gcc -shared -fPIC -I /usr/lib/jvm/java-7-openjdk-amd64/include/ tectC.c  -o libledService.so

将生成的动态库libledService.so用adb推送到/system/lib目录下,否则java层找不到要加载的库。

推送时会报没权限操作/system/lib,是只写文件夹,按照下图,先查看/system挂载的源头
在哪里,然后再重新mount将权限设为rw。即可

执行:

arm-linux-gnueabi-gcc -shared -fPIC  -I /usr/lib/jvm/java-7-openjdk-amd64/include/  tectC.c  -o libledService.so

测试时报错:

dlopen failed: could not load library “libc.so.6” needed by “libledService.so”; caused by library “libc.so.6” not found
上面的意思是说, libledService.so库依赖于libc.so.6,但libc.so.6不存在,那么我们重新编译一下
这个库,为其指定libc.so.6(在源码目录下find -name 搜索libc.so,选个本平台对应的)
指定非标准库:
-nostdlib 非标准动态库.so
解决:

arm-linux-gnueabi-gcc -shared -fPIC -I /usr/lib/jvm/java-7-openjdk-amd64/include/      -nostdlib /home/linux/fspad-733/androidL/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/libc.so      tectC.c -o libledService.so

测试还是报错:

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in “/system/lib/libledService.so”
上面的意思是说,类加载时找JNI动态库的时候 出错,原因是jni动态库中指定的名称要包含包路径
(包名间用/代替.最后是使用该库的java的类名)
解决:

还报错:

java.lang.NoSuchMethodError: no static or non-static method “Lcom/xxg/led/LedService;.open()
上面的意思是说,找不到open函数,原因肯定在JNI层,后来发现是方法签名中对void的处理,void做参数省略不写,void返回值时写V
解决:

最终版的编译选项:

自此,平板上才能正常运行起APP来,但操作底层硬件,还得靠linux驱动

linux驱动端:

跟平时写linux驱动没什么区别。只是注意以下几点:1.模块所依赖的源码要是平板中在用的;2.所用的交叉编译工具链要一致;3.往往andriod编译时是通过一个build.sh完成的,它并没有修改linux源码目录下的Makefile,所以里面的体系结构和工具链没有在内核源码顶层Makefile中指定。故要在模块的Makefile中用export ARCH=arm,   export COROSS_COMPILE=arm-linux-

加载驱动的步骤:

1. setenforce  0  禁用selinux安全保护机制 1.用adb push推送到某个目录下; 2.adb shell,进到相应目录并insmod; 3.修改设备文件权限为chmod 777 /dev/xxx

工程实例:

1.app端:

2.JNI:

3.linux驱动:

再加一个hal层:

转载于:https://www.cnblogs.com/xxg1992/p/6636368.html

你可能感兴趣的文章
ELK日志分析集群部署笔记
查看>>
随机挑几个--脚本
查看>>
python操作数据库之读取数据库数据方法
查看>>
HTTPS工作原理
查看>>
DHCP服务器与NIS服务器
查看>>
Android官方开发文档Training系列课程中文版:分享简单数据之发送简单数据给其它APP...
查看>>
spring boot 框架 启动更新项目,以及生成 "实体_"文件
查看>>
Asp编程中的一些重要函数(2)
查看>>
免运费:卓越亚马逊的最后一搏?
查看>>
Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理
查看>>
linux-Kickstart
查看>>
1月2日课程笔记 lvm介绍与实际操作
查看>>
windows Server 2012安装DNS步骤
查看>>
图像压缩的王者:Image Optimizer V5.1 汉化修正绿色版
查看>>
Nginx + CGI/FastCGI + C/Cpp
查看>>
mysql创建用户
查看>>
暑假期间学习不错的网网页
查看>>
EXPORT_SYMBOL的使用并以使用do_adjtimex调节内核tick_length(滴答长度)为例的说明...
查看>>
设计模式之——设计原则
查看>>
微软发布了ASP.NET MVC框架的第4个预览版本
查看>>