下面介绍下C语言对Java属性以及方法的访问情况以及一些需要注意的地方。
1、访问java静态方法
//java方法
public native static String getStaticStringFromC();
//c代码
//函数实现
JNIEXPORT jstring JNICALL Java_com_zhufk_JniTest_getStaticStringFromC
(JNIEnv * env, jclass jcls){
return (*env)->NewStringUTF(env, "C String");
}
2、访问java非静态方法
//java
public native String getStringFromC(int i);
//c
//函数实现
JNIEXPORT jstring JNICALL Java_com_zhufk_JniTest_getStringFromC
(JNIEnv * env, jobject jobj,jint num){
return (*env)->NewStringUTF(env, "C String2");
}
注:静态方法实现参数是jclass代表的是对象本身,而非静态方法实现参数是jobject代表的是对象实例。
3、非静态属性
//java
public String key="zhufk";
public native void accessField();
//c
//访问非静态属性
JNIEXPORT void JNICALL Java_com_zhufk_JniTest_accessField
(JNIEnv * env, jobject jobj){
//jobj是t的对象,JniTest.class
jclass cls = (*env)->GetObjectClass(env, jobj);
//jfield id
//属性名称、属性签名
jfieldID fid = (*env)->GetFieldID(env, cls, "key", "Ljava/lang/String;");
//获取key属性的值
//get<Type>Field
jstring jstr = (*env)->GetObjectField(env, jobj, fid);
//jstring转char C语言
char* cstr = (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);
//拼接新字符串
char text[20] = "good";
strcat(text, cstr);
//c char转jni jstring
jstring new_jstr = (*env)->NewStringUTF(env, text);
//修改key
//set<Type>Field
(*env)->SetObjectField(env, jobj, fid, new_jstr);
}
4、静态属性
//java
public static int age=20;
public native void accessStaticField();
//c
//访问静态属性
JNIEXPORT void JNICALL Java_com_zhufk_JniTest_accessStaticField
(JNIEnv * env, jobject jobj){
jclass jcls = (*env)->GetObjectClass(env, jobj);
jfieldID fid = (*env)->GetStaticFieldID(env, jcls, "age", "I");
jint age = (*env)->GetStaticIntField(env, jobj, fid);
age++;
(*env)->SetStaticIntField(env, jobj, fid, age);
}