前几天有关Android JNI开发系列教程中有关的源代码,可以在本文中查找:

一、 在JNI中执行Java方法

[java] view plain copy
  1. classAndroidJniDemo{
  2. privatenativevoidexecuteMethod();
  3. privatevoidshow(){
  4. System.out.println("Javacwjprint");//执行了show方法后打印java层的输出
  5. }
  6. publicstaticvoidmain(Stringargs[]){//这里我们在J2SE中测试,Android开发者可以放到Activity中的onCreate调用
  7. AndroidJniDemoajd=newAndroidJniDemo();
  8. ajd.executeMethod();
  9. }
  10. static{
  11. System.loadLibrary("AndroidJniDemo");
  12. }
  13. }

下面是JNI代码:

[cpp] view plain copy
  1. JNIEXPORTvoidJNICALL
  2. Java_AndroidJniDemo_executeMethod(JNIEnv*env,jobjectobj)
  3. {
  4. jclassclazz=(*env)->GetObjectClass(env,obj);//通过类的对象
  5. jmethodIDmid=(*env)->GetMethodID(env,clazz,"show","()V");//查找java中的show方法的ID,最后的签名符号为void类型
  6. if(mid==NULL){
  7. return;//如果方法ID没有找到
  8. }
  9. printf("JNIcwjprint");//从JNI中打印输出
  10. (*env)->CallVoidMethod(env,obj,mid);//执行show方法
  11. }

二、获取/设置类的域或者说属性字段

(1 String类型的属性读写

[java] view plain copy
  1. classAndroidJniDemo2{
  2. privateStringsTmp;
  3. privatenativevoidreadwriteField();
  4. publicstaticvoidmain(Stringargs[]){
  5. AndroidJniDemo2ajd2=newAndroidJniDemo2();
  6. ajd2.sTmp="cwj";
  7. ajd2.readwriteField();
  8. System.out.println("Javacwjprint="+ajd2.sTmp);//java层打印结果
  9. }
  10. static{
  11. System.loadLibrary("AndroidJniDemo2");
  12. }
  13. }

下面是JNI层代码:

[cpp] view plain copy
  1. JNIEXPORTvoidJNICALL
  2. Java_AndroidJniDemo2_readwriteField(JNIEnv*env,jobjectobj)
  3. {
  4. jfieldIDfid;
  5. jstringjstr;
  6. constchar*szTemp;
  7. jclassclazz=(*env)->GetObjectClass(env,obj);
  8. fid=(*env)->GetFieldID(env,clazz,"sTmp","Ljava/lang/String;");//注意sTmp是Java中声明的,String类型在java.lang.String包中,签名符号的格式注意
  9. if(fid==NULL){
  10. return;
  11. }
  12. jstr=(*env)->GetObjectField(env,obj,fid);//Java的String类型,要用GetObjectField函数获取,这里Android123提示大家没有GetStringField这样的函数在JNI中,或者说在C语言中
  13. szTemp=(*env)->GetStringUTFChars(env,jstr,NULL);//因为还需要赋值,在C中我们转换为utf8的类型。
  14. if(szTemp==NULL){
  15. return;
  16. }
  17. printf("JNIcwjprint=%s",szTemp);//先打印Java层传进来的值
  18. (*env)->ReleaseStringUTFChars(env,jstr,szTemp);//szTemp打印完不用了要及时释放掉
  19. jstr=(*env)->NewStringUTF(env,"android123");//返新的字段值,供Java层打印
  20. if(jstr==NULL){
  21. return;
  22. }
  23. (*env)->SetObjectField(env,obj,fid,jstr);//设置新的属性值。
  24. }

(2 int或double类似的类型的属性读写,本例同时属性值是一个静态的定义,注意下面加粗的static关键字

[java] view plain copy
  1. classAndroidJniDemo3{
  2. privatestaticintsAge;
  3. privatenativevoidreadwriteField();
  4. publicstaticvoidmain(Stringargs[]){
  5. AndroidJniDemo3ajd3=newAndroidJniDemo3();
  6. AndroidJniDemo3.sAge=23;
  7. ajd3.readwriteField();//执行jni层
  8. System.out.println("Javacwjprint="+sAge);//java层打印新的值,应该为120
  9. }
  10. static{
  11. System.loadLibrary("AndroidJniDemo3");
  12. }
  13. }

下面是JNI层代码:

[cpp] view plain copy
  1. JNIEXPORTvoidJNICALL
  2. Java_AndroidJniDemo3_readwriteField(JNIEnv*env,jobjectobj)
  3. {
  4. jfieldIDfid;
  5. jintnTemp;
  6. jclassclazz=(*env)->GetObjectClass(env,obj);
  7. fid=(*env)->GetStaticFieldID(env,clazz,"sAge","I");//因为是整形,这里签名符号为I,注意使用的函数中包含Static代表是一个静态的属性
  8. if(fid==NULL){
  9. return;
  10. }
  11. nTemp=(*env)->GetStaticIntField(env,clazz,fid);
  12. printf("JNIcwjprint=%d",nTemp);//这里应该显示23
  13. (*env)->SetStaticIntField(env,clazz,fid,120);//设置新的值为120,注意包含了Static,java层中定义的sAge是静态的。
  14. }

给出了较完整的JNI下执行Java的源代码第一部分,有关第二部分可以查看 Android JNI实力代码(二)

更多相关文章

  1. Android中级篇之区分系统程序和安装程序
  2. android Service理解
  3. Android(安卓)Bitmap内存限制
  4. android AIDL简单步骤
  5. Android(安卓)百分比布局详解及实例代码
  6. Android(安卓)利用soap协议与服务端进行通信
  7. Android(安卓)Studio gradle配置详解
  8. Android在标准linux基础上对休眠唤醒的实现(一)(二)(三)【转】
  9. 【工作总结】一键清理总结

随机推荐

  1. 2019年Android版本分布(市场占有率、市场
  2. Android线程间的通信
  3. 对于Android DEX文件详细说明
  4. 基于Android Studio的Android第一个软件-
  5. Android Sensor详解(8)sensor hal层分析第
  6. Android[中级教程]第五章 XML解析之PULL
  7. Android通知示例(一)
  8. Android传感器概述(七)
  9. Android Scroll详解(一):基础知识
  10. Mio要推Android汽车导航装置