• andriod底层最简开发流程


    动态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驱动:

    代码下载: https://git.coding.net/xxgui1992/Android-jni1.git

    再加一个hal层:

    加了hal层的范例:https://git.coding.net/xxgui1992/Android-hal.git

  • 相关阅读:
    LR 场景设置
    win7 快捷键
    P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)
    A
    P1494 [国家集训队]小Z的袜子(莫队)
    P2709 小B的询问(莫队入门)
    G
    #6285. 数列分块入门 9(区间的最小众数 离散化+数列分块)
    #6284. 数列分块入门 8(区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 c)
    #6283. 数列分块入门 7(区间乘法,区间加法,单点询问)
  • 原文地址:https://www.cnblogs.com/xxg1992/p/6636368.html
Copyright © 2020-2023  润新知