在java中定义两个属性
1.普通属性
2.静态属性
public String name ="jason";
public static int age = 21;
定义获取的方法
public native String accessField();
public native void accessStaticField();
javah生成头文件
/*
* Class: com_boom_JNITest
* Method: accessField
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_boom_JNITest_accessField
(JNIEnv *, jobject);
/*
* Class: com_boom_JNITest
* Method: accessStaticField
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_boom_JNITest_accessStaticField
(JNIEnv *, jobject);
新建源代码实现具体
1.普通属性
JNIEXPORT jstring JNICALL Java_com_boom_JNITest_accessField
(JNIEnv *env, jobject jobj){
//jobj是t对象,NdkTest.class
jclass cls = (*env)->GetObjectClass(env,jobj);
//jfieldID
//属性名称,属性签名
jfieldID fid = (*env)->GetFieldID(env,cls,"name","Ljava/lang/String;");
//jason >> super Jason
//获取name属性的值
//Get<Type>Field
jstring jstr = (*env)->GetObjectField(env,jobj,fid);
printf("jstr:%#x\n",&jstr);
//jstring-->c字符串
//isCopy 是否复制 (true代表复制,false代表不复制)
char *c_str = (*env)->GetStringUTFChars(env,jstr,NULL);
//拼接得到新的字符串
char text[20] = "super";
strcat(text,c_str);
//c字符串 -> jstring
jstring new_jstr = (*env)->NewStringUTF(env,text);
//修改name
//Set<Type>Field
(*env)->SetObjectField(env,jobj,fid,new_jstr);
printf("new_jstr:%#x",&new_jstr);
return new_jstr;
}
2.静态属性
//访问静态属性
JNIEXPORT void JNICALL Java_com_boom_JNITest_accessStaticField
(JNIEnv *env, jobject jobj){
//jclass
jclass cls = (*env)->GetObjectClass(env,jobj);
//jfieldID
jfieldID fid = (*env)->GetStaticFieldID(env,cls,"age","I");
//GetStatic<Type>Field
jint age = (*env)->GetStaticIntField(env,cls,fid);
age++;
//修改
//SetStatic<Type>Field
(*env)->SetStaticIntField(env,cls,fid,age);
}