android 调用成员方法,JNI-访问成员变量和方法

现在我们知道了怎样使用native

code访问简单的数据类型和引用参考类型(string,array),下面我们来介绍怎样让jni代码去访问java中的成员变量和成员函数,然后可以再jni中回调java中的方法。

-------------------------------------------------------------------------------------

Accessing fields

java提供2中成员,静态成员和非静态成员,JNI支持了怎么样去get和set这些静态以及非静态成员的方法,下面来举一个例子。

先来访问非静态成员。

我们先在类中声明一个非静态的成员变量:

publicclassMyJNIextendsActivity {

//declear a instance field

privateString s="123";

在点击按钮的时候我们把title的textview的字符串改成s,

MyJNI mj =newMyJNI();

mj.accessField();

tv.setText(mj.s);

java代码很简单,只要实现我们的功能就好了,下面来看jni是如何进入class中的成员变量的:

Java_com_android_jni_MyJNI_accessField(JNIEnv *env,jobject obj)

{

jfieldID fid;

jstring jstr;

constchar*str;

//get a reference to obj's class

jclass cls = (*env)->GetObjectClass(env,obj);

// jclass cls = (*env)->FindClass(env,"com/android/jni/Native");

__android_log_print(ANDROID_LOG_INFO,"-JNI-","here in native C!");

//look for the instance field in cls

fid = (*env)->GetFieldID(env,cls,"s",

"Ljava/lang/String;");

if(fid == NULL){

__android_log_print(ANDROID_LOG_INFO,"-JNI-","can not find field");

return;

}

//read the instance field s

jstr = (*env)->GetObjectField(env,obj,fid);

str = (*env)->GetStringUTFChars(env,jstr,NULL);

if(str == NULL)

return;

(*env)->ReleaseStringUTFChars(env,jstr,str);

//create a new string and overwrite the instance field

jstr = (*env)->NewStringUTF(env,"abc");

if(jstr == NULL)

return;//out of memory

(*env)->SetObjectField(env,obj,fid,jstr);

}

为了访问目标类中的成员变量,要做2步,首先呼叫GetFieldID从类中来得到一个field

ID,根据成员的名字和描述:

fid = (*env)->GetFieldID(env,cls,"s",

"Ljava/lang/String;");

然后根据这个field ID来访问这个成员:

jstr = (*env)->GetObjectField(env,obj,fid);

因为在java中string是对象,所以这边呼叫的是GetObjectField函数。

最后运行模拟器,点击按钮的时候textView会变成JNI中修改的“abc”

a4c26d1e5885305701be709a3d33442f.png

ok,这部分结束,下面来看如何访问静态成员变量。

同样的java代码中:

publicclassMyJNIextendsActivity {

//declear a instance field

privatestaticintsi=100;

privateString s="123";

我们定义一个静态的整形变量si初始化为100,当我们点击按钮的时候通过jni访问static

field来改变si的值,然后再title的textView中显示出来。

MyJNI mj =newMyJNI();

mj.accessStaticField();

tv.setText(mj.si+"");

我们来看下如何进入static field:

void

Java_com_android_jni_MyJNI_accessStaticField(JNIEnv *env,jobject obj)

{

jfieldID fid; //store the field id

jint si;

//get a reference to obj's class

jclass cls = (*env)->GetObjectClass(env,obj);

__android_log_print(ANDROID_LOG_INFO,"-JNI-","here in native C!");

//look for the static field si in lcs

fid = (*env)->GetStaticFieldID(env,cls,"si","I");

if(fid == NULL)

return;//field not found

//access the static field si

si = (*env)->GetStaticIntField(env,cls,fid);

(*env)->SetStaticIntField(env,cls,fid,200);

}

大家可以看到只是调用的方法不一样,多了一个static,和非静态的使用方法一样。

-------------------------------------------------------------------------------------------------------

jni中访问class 中的field就到此结束,下面一篇会介绍如何访问java中class 的method。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值