JNI开发之方法签名与Java通信(二)

}

//获取字段ID,第二个参数类名称,第三个参数字段名,第三个参数字段签名,详细参见签名对照表
jfieldID id = (*env)->GetFieldID(env,cls,“name”,“Ljava/lang/String;”);
if(id==NULL)
{
LOGD(“Field token not found”);
return NULL;
}
//获取字段内容,调用GetXXXField,xxx为字段类型。除基本类型外,其他的都使用GetObjectField
jstring name=(jstring) (*env)->GetObjectField(env,user,id);
return name;
}

2.6、jni访问Java中的静态字段

java代码

User user = new User();
user.name = “zhang san”;
user.age = 30;
User.token = “2018-2011—3223”;
String token =showUserStaticToken(user);
Log.i(“MainActivity”,“show static token:”+token);
public native String showUserStaticToken(User user);

jni代码

//访问User中的静态字段Token
JNIEXPORT jstring JNICALL Java_com_zzy_ndkdemo_MainActivity_showUserStaticToken(JNIEnv *env, jobject instance, jobject user) {

//获取User的类名称
jclass cls=(*env)->GetObjectClass(env,user);
if (cls == NULL) {
LOGD(“Class %s not found”);
return NULL;
}

//获取静态字段ID,第二个参数类名称,第三个参数字段名,第三个参数字段签名,详细参见签名对照表
jfieldID id = (*env)->GetStaticFieldID(env,cls,“token”,“Ljava/lang/String;”);
if(id==NULL)
{
LOGD(“Field token not found”);
return NULL;
}

//获取字段内容,调用GetStaticXXXField,xxx为字段类型。除基本类型外,其他的都使用GetStaticObjectField
jstring token=(*env)->GetStaticObjectField(env,cls,id);
return token;
}

1、从中我们可以看出静态字段比非静态字段的访问多加了一个static,访问函数由类实例,变成类引用。

2、如果静态字段中不存在instance类中,我们可以通过FindClass进行访问,其中第二个参数为类的全路径

jclass cls = (*env)->FindClass(env, “com/zzy/ndkdemo/User”);
if (cls == NULL) {
LOGD(“Class %s not found”);
}

2.7、jni中更新java
  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值