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