JNI 是 Java Native Interface 的缩写,用以解决 Java 对本地方法的操作问题,而本地方法是以库文件的形式存放的(.dll for windows,.so for Unix)。
分享一些常见的jni方法:
GetStringUTFChars 将jstring转换成为UTF-8格式的char*
GetStringChars 将jstring转换成为Unicode格式的char*
ReleaseStringUTFChars 释放指向UTF-8格式的char*的指针
ReleaseStringChars 释放指向Unicode格式的char*的指针
NewStringUTF 用 char* 创建一个UTF-8格式的 jstring 对象
NewString 用char*创建一个Unicode 格式的 jstring对象
GetStringUTFLengt 获取UTF-8格式的char*的长度
GetStringLength 获取Unicode格式的char*的长度
在JNI中可以通过c语言调用java函数
在JNI里使用java类的某些方法,分为以下几个步骤:
1. 查找该类:
jclass xxx = (*env)->FindClass(env, "Lclass_name;");
2. 查找该类的初始化方法:
jmethodID xxx = (*env)->GetMethodID(env, jclass, "<init>", "(M)N");
3. 查找需要调用的该类的方法:
jmethodID xxx = (*env)->GetMethodID(env, jclass, "(M)N" );
4. 初始化该类的实例:
jobject xxx = (*env)->NewObject(env, jclass, jmethodID );
5. 调用实例的某方法:
(*env)->CallObjectMethod(env, jclass, jmethodID, [parameter1, parameter2,...] );
6. 释放实例:
(*env)->DeleteLocalRef(env, xxx);
需要说明的有两点:
1.调用的java函数分为静态方法和非静态方法,返回的参数有java独有的类型或者c中存在的类型
如java方法为静态方法则调用函数应为CallStaticXXXMethod(xxx为返回类型,可以为Void,Int,Char或者java类型的object)
2."(M)N"是该函数的输入和输出参数的类型签名(Type Signature)。 这里,JNI中对于以下类型定义了类型签名:
Type Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
另外[加类型名表示该类型的数组,L加类名表示参数是java类,如Ljava/lang/Object;(注意“;”是必须的,否则机器不识别)