安卓JNI开发总结

来源:互联网 发布:数据可视化分析 编辑:程序博客网 时间:2024/05/18 03:10

开发流程

  1. 编写c++头文件
  2. 编写java代码
  3. 编写jni代码
  4. 联调:编译问题、load问题、接口回调问题等

java层和jni层之间的调用

  1. java调用jni(native)方法
    • java层要做的事情
      • 在libs文件夹中放so文件
      • System.LoadLibrary(“libraryname”)
      • 定义native方法
      • 在java代码中直接调用
    • native层要做的事情
      • register注册,分动态注册和静态注册:RegisterNatives
      • 实现注册时相应的native方法,native方法中调用c++代码,实现功能或返回相应值。
  2. jni(native)调用java代码
    • java层要做的事情
      • 编写相应方法实现某些功能或获取某些数据
      • 完成后一般不能改动包名、类名、方法名、参数名、参数类型,返回值类型等,如需改动,jni层也要做出相应修改。
    • native层要做的事情
      • 对于会频繁使用的类首先cache缓存相应类、变量及方法,或者对于只使用一次的类在使用时再获取相应id。FindClass、GetMethodID、GetFieldID。
      • 根据相应id调用到java方法NewObject、CallXXXMethod、CallStaticXXXMethod

类型对应

  • 数据结构

    • long - J
    • int - I
    • short - S
    • float - F
    • double - D
    • void -V
    • boolean - Z
    • byte - B
    • char - C
    • int[] - [I
    • int[][] - [[I
    • String - Ljava/lang/String;
  • 方法

    • void fun1( ) - V
    • boolean fun2(int param) - (I)B
    • int fun3(String param) - (Ljava/lang/String;)I
    • long fun4(int param1,String param2) - (ILjava/lang/String;)J
    • String fun5(int[] param1,String param2) - ([ILjava/lang/String;)Ljava/lang/String;

常用方法

  • java调用jni(native)方法
    • register
      • env->RegisterNatives(…)
  • jni(native)调用java代码
    • cache
      • env->FindClass(…)
      • env->GetMethodID(…)
      • env->GetFieldID(…)
    • 调用
      • env->NewObject(jclass, jmethodID initMethodID,[param…])–该方法相当于调用java类的构造函数
      • env->CallVoidMethod(jobject, jmethodID,[param…])
      • env->CallIntMethod(…)
      • env->CallBooleanMethod(…)
      • env->CallObjectMethod(…)
      • env->CallStaticVoidMethod(…)
      • env->CallStaticIntMethod(…)
      • env->CallStaticBooleanMethod(…)
      • env->CallStaticObjectMethod(…)
原创粉丝点击