JNI 基本工作流程
1. 在java代码中声明一个native的方法.
2. 用javah命令生成 native方法对应的头文件.javah命令需要注意包名和class 所在的目录
3. 在工程中创建一个jni目录,把头文件 拷贝jni目录
4. 创建Android.mk文件.
5. 实现头文件里面未实现的方法.
6. 在工程目录下 使用ndk-build 命令生成库文件. 生成的这个库文件如果是静态库是一个.a的文件.
.a文件的文件需要拷贝到平台下E:\android-ndk-cpp\build\platforms\android-8\arch-arm\usr\lib
如果是动态库是一个.so的文件. 我们的adt 会通过aapt 把文件打包到apk里面 . 程序在android里面. so文件就在data/data/包名下/lib
注意: eclipse 会缓存文件,所以重新编译库文件的时候需要把工程给clean一下.
生成一个方法的签名需要调用 javap -s 这个命令
Java类型 | 本地类型 | 描述 |
boolean | jboolean | C/C++8位整型 |
byte | jbyte | C/C++带符号的8位整型 |
char | jchar | C/C++无符号的16位整型 |
short | jshort | C/C++带符号的16位整型 |
int | jint | C/C++带符号的32位整型 |
long | jlong | C/C++带符号的64位整型e |
float | jfloat | C/C++32位浮点型 |
double | jdouble | C/C++64位浮点型 |
Object | jobject | 任何Java对象,或者没有对应java类型的对象 |
Class | jclass | Class对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 任何对象的数组 |
boolean[] | jbooleanArray | 布尔型数组 |
byte[] | jbyteArray | 比特型数组 |
char[] | jcharArray | 字符型数组 |
short[] | jshortArray | 短整型数组 |
int[] | jintArray | 整型数组 |
long[] | jlongArray | 长整型数组 |
float[] | jfloatArray | 浮点型数组 |
double[] | jdoubleArray | 双浮点型数组 |
※ JNI类型映射
函数 | Java数组类型 | 本地类型 |
GetBooleanArrayElements | jbooleanArray | jboolean |
GetByteArrayElements | jbyteArray | jbyte |
GetCharArrayElements | jcharArray | jchar |
GetShortArrayElements | jshortArray | jshort |
GetIntArrayElements | jintArray | jint |
GetLongArrayElements | jlongArray | jlong |
GetFloatArrayElements | jfloatArray | jfloat |
GetDoubleArrayElements | jdoubleArray | jdouble |
JNI数组存取函数