part_c_掌握api和控制点从java到jni接口c03_d_jni_从c调用java函数_ok_W_第1页
part_c_掌握api和控制点从java到jni接口c03_d_jni_从c调用java函数_ok_W_第2页
part_c_掌握api和控制点从java到jni接口c03_d_jni_从c调用java函数_ok_W_第3页
part_c_掌握api和控制点从java到jni接口c03_d_jni_从c调用java函数_ok_W_第4页
part_c_掌握api和控制点从java到jni接口c03_d_jni_从c调用java函数_ok_W_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论