相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等....
如何在JNI中调用Java方法呢?就需要先了解FindClass和GetMethodID了。
FindClass和GetMethodID
在JNI中可以通过FindClass可以找到Java类,得到jclass,例如:
jclass clz=(*env)->FindClass(env,"com/jjz/JniHandle");
FindClass的第二个参数需要传入类的完整包名。
使用GetMethodID可以获取类的方法,得到jmethodID,例如:
jmethodID getStringFromJava=(*env)->GetMethodID(env,class,"getStringForJava","()V");
如果调用的是静态方法需要使用GetStaticMethodID获取。通过FindeClass可以在JNI中找到需要调用的类,GetMethodID可以找到对应的方法,这样就可以在JNI中调用Java的方法了。
在GetMethodID中,第四个参数是()V,这个是方法签名。那么方法签名的规则又是怎么样呢?
方法签名
在GetMethodID中第四个参数()V就是方法签名,Java是支持重载的,所以需要标明方法的传参和返回值,这就是方法的签名。它是用来保证方法的唯一性。其中()代表不传参数,V代表返回值为void。
方法签名对于Java的类型都有一一对应的值。方法签名中用大写的字母对应了java的基本数据类型:
Z -> boolean
B -> byte
C -> char
S -> short
I -> int
J -> long
F -> float
D -> double
其实就是有两个比较特殊的:boolean对应的是Z,long对应的J,其他的都是首个字母的大写即可。
数组的表示方法,以[为标志,一个[标识一维数组ÿ