Android jni(2)

来源:互联网 发布:慧莫森软件科技 编辑:程序博客网 时间:2024/05/21 06:44

交叉编译

  • 在一个平台下编译出另一个平台可以执行的二进制文件
  • 不同平台是彼此不兼容的
  • CPU平台:x86,arm,mips
  • 系统平台:Windows,Linux,Mac os
  • 原理:模拟另一个平台的特性去编译代码

开发工具

  • NDK:native development kits
  • CDT:C/C++ development tools
    • 高亮显示C语言关键字

NDK目录

  • build/tools:存放了大量Linux的批处理文件,用于模拟Linux特性交叉编译
  • docs:离线帮助文档
  • platforms:按照Android版本分了若干个文件夹
    • 按系统平台分了3个文件夹
      • usr:Unix system resource
        • include:开发jni会用到的头文件
        • lib:编译运行C代码时会用到的so动态链接库
  • sample:使用jni的案例
  • sources:ndk的源码
  • ndk-build:编译C代码,打包成so类库

JNI流程

  1. 在java代码定义本地方法
    • 在项目根目录下创建jni文件夹,文件夹中创建c文件
    • c文件中定义函数实现java的本地方法
    • 函数的命名要注意返回值、包名、类名本地方法名和方法的参数
    • 在jni文件夹下创建Android.mk文件,配置要编译的c文件是哪一个
    • 编译打包c文件,生成so类库
    • 在java代码中,加载so类库,然后调用本地方法

常见错误

找不到类库

  • 类库名写错了
  • 没有添加相应平台的支持

找不到本地方法

  • 没有加载类库
  • C函数名写错

javah

  • 生成函数声明
  • 1.7:在src目录下执行javah com.itheima.helloworld2.MainActivity
  • 1.6:在bin/classes目录下执行

添加本地支持

  • 自动创建jni文件夹,文件夹中自动创建cpp文件和Android.mk文件
  • 项目可以指定jni.h头文件的路径
  • c文件中可以实时编译
  • 项目部署时,自动编译打包出so类库,然后才会部署到手机上
  • 在jni–》application。mk–》添加“APP_ABI := armeabi x86”

javap

  • 在bin/classes目录下执行javap -s com.itheima.helloworld2.MainActivity
0 0
原创粉丝点击