访问非静态域(域=成员)
例如:现在要在C中访问一个java文件中的string变量key
public String key;
可以自定义jni在C上的接口java_类名_native名称
首先非静态获取jclass
jclass jclz = (*env)->GetObjectClass(env,jobj);
获取key属性的id
java jni中给每一个field定义的一个ID
三个参数:属性名称。属性签名。访问域
例如:
jfieldID fid = (*env)->GetFieldID(env,"key","Ljava/lang/String")
如果对象为static需要改成>GetStaticField
拿到key对应的值
GET***Field
jstring jstr = (*env)->GetObjectField(env,jobj,fid);
把jstr转换为C中的char *
char * c_str = (*env)->GetStringUTFChars(env,jstr.NULL)
生成新的字符串
再次转换回jstring
jstring new_str = (*env)->NewStringUTF(env,c_str);
放回java
(*env)->setObjectField(env,jobj,fildId,new_str);
释放申请的空间,char,和jstring
(*env)->ReleaseStringChars(env,new_str,c_str)
jint类型 = int,因此不需要像String那样转换C/C++可以识别的类型,可以直接对jint进行操作
例如
jint sum ;
sum = 10 ;
其它数据类型一样