2.5 JNI操作Java对象
JNI提供了Java和C/C++方法互操作的机制,上节只介绍了如何在Java中调用JNI实现方法,那JNI又是如何操作Java层呢?
JNI方法接受的第二个参数是Java对象:jobject,可以在JNI中操作这个jobject进而操作Java对象提供的变量和方法。
2.5.1 访问Java对象
要操作jobject,就是要访问这个对象并操作它的变量和方法。JNI提供的类和对象操作函数有很多,常用的有两个:FindClass和GetObjectClass,在C和C++中分别有不同的函数原型。C++中的函数原型如下:
jclass FindClass(const char*name);//查找类信息
jclass GetObjectClass(jobject obj);//返回对象的类
C中的函数原型如下:
jclass(FindClass)(JNIEnv,const char*);
jclass(GetObjectClass)(JNIEnv,jobject);
我们可以看看Log系统是怎么操作Java对象的。打开android_util_Log.cpp,定位到register_android_util_Log函数:
int register_android_util_Log(JNIEnv*env)
{
jclass clazz=env->FindClass("android/util/Log");
……
}
通过给FindClass传入要查找类的全限定类名(以“/”分隔路径)即可,之后方法返回一个jclass的对象,这样就可以操作这个类的方法和变量了。