在java编程语言中有非静态成员函数和静态成员函数,jni允许我们访问到java中的成员函数,然后再jni中调用,这里我就来举例说明在jni中是如何做到的。 我们先在java中定义2个成员函数,一个非静态的,一个是静态的,分别会把title的textview设置成不同的: pu
在java编程语言中有非静态成员函数和静态成员函数,jni允许我们访问到java中的成员函数,然后再jni中调用,这里我就来举例说明在jni中是如何做到的。
我们先在java中定义2个成员函数,一个非静态的,一个是静态的,分别会把title的textview设置成不同的值:
public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); mcontext = this; bt1 = (button)findviewbyid(r.id.button1); bt2 = (button)findviewbyid(r.id.button2); tv = (textview)findviewbyid(r.id.tv); tv.settext(+si); bt1.setonclicklistener(new mybuttonlistener()); bt2.setonclicklistener(new mybuttonlistener()); } class mybuttonlistener implements onclicklistener{ public void onclick(view v) { if(v.getid() == r.id.button1 ){ accessinstancemethod(instance method call); } if(v.getid() == r.id.button2 ){ accessinstancemethod(static method call); } } } private void instancemethod(string str) { tv.settext(str); } private void static staticmethod(string str) { tv.settext(str); } public native void accessinstancemethod(string str); public native void accessstaticmethod(string str);
我们再来看下jni中是如何处理的:
void java_com_android_jni_myjni_accessinstancemethod(jnienv *env, jobject obj, jstring jstr){ const jbyte *str; str = (*env)->getstringutfchars(env,jstr,null); if(str == null) return ; __android_log_print(android_log_info,-jni-,%s,str); (*env)->releasestringutfchars(env,jstr,str); jclass cls = (*env)->getobjectclass(env,obj); jmethodid mid = (*env)->getmethodid(env,cls,instancemethod, (ljava/lang/string;)v); if(mid == null) return ; (*env)->callvoidmethod(env,obj,mid,jstr);}voidjava_com_android_jni_myjni_accessstaticmethod(jnienv *env, jobject obj, jstring jstr){ const jbyte *str; str = (*env)->getstringutfchars(env,jstr,null); if(str == null) return; __android_log_print(android_log_info,-jni-,%s,str); (*env)->releasestringutfchars(env,jstr,str); jclass cls = (*env)->getobjectclass(env,obj); jmethodid mid = (*env)->getstaticmethodid(env,cls,staticmethod, (ljava/lang/string;)v); if(mid == null) return ; (*env)->callstaticvoidmethod(env,obj,mid,jstr);}
这边都比较简单,先是找到class,然后得到method id,之后是根据method id调用java中的function
运行模拟器,点击不同的按钮观察title的textview:
-----------------------------------------------------------------------------------------------------
调用java的method就介绍到这,关于别的返回值的函数大家可以自己去尝试,用法都是差不多的。