版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基於軟硬整合觀點C03_dJNI:从C调用Java函数 ( d)By 高煥堂基於軟硬整合觀點4、C存取Java对象的值JNI/* com.misoo.counter.CounterNative.c */ JNIEXPORT void JNICALLJava_com_misoo_counter_CounterNative_nativeExec (JNIEnv *env, jobject thiz) /CounterNative x, y;x = new CounterNative(); y = new CounterNative();xnumb: ynumb:JNI/* com.misoo.co
2、unter.CounterNative.c */ JNIEXPORT void JNICALLJava_com_misoo_counter_CounterNative_nativeExec (JNIEnv *env, jobject thiz) /x.nativeExec();xnumb: ynumb:JNI/* com.misoo.counter.CounterNative.c */ JNIEXPORT void JNICALLJava_com_misoo_counter_CounterNative_nativeExec (JNIEnv *env, jobject thiz) /y.nati
3、veExec();xnumb: ynumb:JNI/* com.misoo.counter.CounterNative.c */ JNIEXPORT void JNICALLJava_com_misoo_counter_CounterNative_nativeExec (JNIEnv *env, jobject thiz) /0. 有了Java层对象(thiz)1. 问这个对象thiz的类,得到clazzjclass clazz = (*env)-GetObjectClass(env, thiz);2. 问这个类里的setV()函数,得到methodIDm_mid = (*env)-GetMe
4、thodID(env, clazz, setV, (I)V);3. 基于methodID和thiz,调用setV()函数int sum = 25;(*env)-CallVoidMethod(env, thiz, m_mid, sum);xnumb: ynumb:JNI/*com.misoo.counter.CounterNative.c*/sum = 25(*env)-CallVoidMethod(env, thiz, m_mid, sum);/ xnumb: ypublic class CounterNative private void setV(intthis.numb = a;numb
5、: 25JNI/*com.misoo.counter.CounterNative.c*/sum = 25(*env)-CallVoidMethod(env, thiz, m_mid, sum);/ C函数直接存取属性值 刚才是透过函数调用(function call)来存取Java对象的属性值。 C函数也能直接存取属性值。0. 有了Java层对象(thiz)1. 问这个对象thiz的类,得到clazzjclass clazz = (*env)-GetObjectClass(env, thiz);2. 问这个类里的numb属性,得到fieldIDm_fid = (*env)-GetFieldID
6、(env, clazz, numb, I);3. 基于fieldID和thiz,直接存取numb值n = (int)(*env)-GetObjectField(env, m_object, m_fid); 例如,在CounterNative里可定义numb等属性,如下:依据对象和属性ID,取得属性值调用setV()函数,将sum回传到Java层 范例代码/ ac01.java/ public class ac01 extends Activity implements OnClickListener static public ac01 ref;Overridepublic void onCr
7、eate(Bundle savedInstanceState)ref = this;/ .Override public void onClick(View v) switch(v.getId() case 101:CounterNative cn = new CounterNative();cn.nativeExec(); case 103:finish();break;break; 指令:cn.nativeExec()。由于nativeExec() 是个本地函数,就转而调用到com_misoo_counter_CounterNative_nat iveExec()函数。 其先取得Java层
8、的numb值,计算出sum值, 再调用Java层的setV()函数,显示出来。/ CounterNative.java/ public class CounterNative private static Handler h; private int numb;static System.loadLibrary(MyCounter2);public CounterNative()h = new Handler()public void handleMessage(Message msg) ac01.ref.setTitle(msg.obj.toString();numb = 25; nativ
9、eSetup();private void setV(int value)String str = Value = + String.valueOf(value); Message m = h.obtainMessage(1, 1, 1, str); h.sendMessage(m);private native void nativeSetup(); public native void nativeExec(); 由于本地的C函数仍属于CounterNative类的一部分,所以C函数仍可以调用到CounterNative类的private函数(如setV() 函数)。 此外,本地函数nat
10、iveSetup()只提供给建构函数来调用,而不给其它类别使用,所以可以将nativeSetup()宣告为private函数。/* com.misoo.counter.CounterNative.c */#include com_misoo_counter_CounterNative.hjobjectm_object;jmethodID m_mid; jfieldID m_fid;JNIEXPORT void JNICALLJava_com_misoo_counter_CounterNative_nativeSetup (JNIEnv *env, jobject thiz) jclass cl
11、azz = (*env)-GetObjectClass(env, thiz); m_object = (jobject)(*env)-NewGlobalRef(env, thiz); m_mid = (*env)-GetMethodID(env, clazz, setV, (I)V); m_fid = (*env)-GetFieldID(env, clazz, numb, I); return;JNIEXPORT void JNICALLJava_com_misoo_counter_CounterNative_nativeExec (JNIEnv *env, jobject thiz) int n, i, sum = 0;n = (int)(*env)-GetObjectField(env, m_object, m_fid); for(i=0; iCallVoidMethod(env, m_object, m_mid, sum); return; 其中的thiz就是从Java层传递过来的对象指针。首先将thiz传给VM的GetObjectClass() 函数,取得该对象的类指针(即clazz)。 接着,将cla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 铺布机项目商业计划书及实施方案|瑞克咨询|2024年编|
- 2024年机械制造行业技能考试-数控机床装调维修工笔试参考题库含答案
- 高效节能电动机项目可行性研究报告及运营方案|瑞克咨询|2024年编|
- 十年高考高考英语真题分项详解 专题23 阅读理解 任务型阅读(含解析)-人教高三全册英语试题
- 2024年新疆住院医师-新疆住院医师医学影像笔试参考题库含答案
- 2024年教师招聘考试-小学教师招聘笔试参考题库含答案
- 2024年建筑八大员(九大员)住房城乡建设领域现场专业人员考试-土建质量员质检员笔试参考题库含答案
- 2024年岗位知识竞赛-教师信息技术知识竞赛笔试参考题库含答案
- 2024年安徽住院医师-安徽住院医师神经内科笔试参考题库含答案
- 2024年大学试题(语言学)-语言学纲要笔试参考题库含答案
- 办公楼建筑结构设计 土木工程专业毕业设计计算书
- 学校各功能馆室解说词资料
- 单身声明模板
- 胎心监护ppt课件
- 煤制油流程图4页
- 柑橘专业合作社章程
- 限速器校验报告
- 译林版五下英语5B Unit 8 精练
- 行书八种基本笔画的写法图解.docx
- 2015年健康教育技能大赛试题
- 两千年来各地区GDP总值及占全球比重情况
评论
0/150
提交评论