jni访问java成员

来源:互联网 发布:技校 程序员 编辑:程序博客网 时间:2024/06/14 00:15

访问非静态域(域=成员)
例如:现在要在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 ;

其它数据类型一样