分类: LINUX
2011-09-01 22:47:58
本地代码访问Java代码
在被调用的C/C++函数中也可以反过来访问java程序中的类。
Java通过机制调用c/c++写的native程序。c/c++开发的native程序需要遵循一定的JNI规范,下面的例子就是一个JNI函数声明:
Javah工具生成的c/c++函数声明中,可以看到有两个参数。
JNIEnv类型
JNIEnv类型实际上代表了Java环境,通过这个JNIEnv*指针,可以对Java端的代码进行操作。例如,创建
Java类的对象,调用Java对象的方法,获取Java对象的属性等等。JNIEnv的指针会被JNI传入导本地方法
的实现函数中来对Java端的代码进行操作。
JNIEnv类中有很多函数可以用:
NewObject/NewString/New
Get/Set
Get/SetStatic
Call
Java类型在C/C++中的映射关系
java类型 本地类型 JNI定义的别名
int long jint/jsize
jclass的取得
为了能够在C/C++中使用Java类。JNI.h头文件中专门定义了jclass类型来表示Java中的Class类。
JNIEnv类中有如下几个简单的函数可以取得jclass:
jclass FindClass(const char* clsName);
jclass GetObjectClass(jobject obj);
jclass GetSuperClass(jclass obj);
FindClass会在classpath系统环境变量下寻找类。传入完整类名,注意包与包之间是用‘/’而不是‘.’来分
隔。
jclass cls_string = env->FindClass("java/lang/String");
访问Java类中的属性与方法
在C/C++本地代码中访问Java端的代码,一个常见的应用就是获取类的属性和调用类的方法。为了再C/C++
中表示属性和方法,JNI在Jni.h中定义了jfieldID,jmethodID类型来分别代表Java端的属性和方法。
我们在访问或是设置Java属性的时候,首先就要再本地代码取得代表该Java属性的jfieldID,然后才能再
本地代码进行Java属性操作。同样的,我们需要呼叫Java端的方法时,也是需要取的代表该方法的
jmethodID才能进行Java方法调用。
使用JNIEnv的GetFieldID/GetMethodID
GetStaticFieldID/GetStaticMethodID
来取得相应的jfieldID和jmethodID