Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段

转载 2012年03月29日 17:52:11

转自:http://www.android123.com.cn/androidkaifa/686.html

(1 String类型的属性读写

class AndroidJniDemo2 {
 private String sTmp;
 private native void readwriteField();
 public static void main(String args[]) {
  AndroidJniDemo2 ajd2 = new AndroidJniDemo2();
  ajd2.sTmp = "cwj";
  ajd2.readwriteField();
  System.out.println("Java cwj print ="+ajd2.sTmp);  //java层打印结果
 
 }
 static {
  System.loadLibrary("AndroidJniDemo2");
 }
}

下面是JNI层代码:
 
JNIEXPORT void JNICALL
Java_AndroidJniDemo2_readwriteField(JNIEnv *env, jobject obj)
{
 jfieldID fid; 
 jstring jstr;
 const char *szTemp;
 
 jclass clazz = (*env)->GetObjectClass(env, obj); 
  
 fid = (*env)->GetFieldID(env, clazz, "sTmp", "Ljava/lang/String;"); // 注意sTmp是Java中声明的,String类型在java.lang.String包中,签名符号的格式注意
 if (fid == NULL) {
  return; 
 }
 
 jstr = (*env)->GetObjectField(env, obj, fid);  //Java的String类型,要用GetObjectField函数获取,这里Android123提示大家没有GetStringField这样的函数在JNI中,或者说在C语言中
 szTemp = (*env)->GetStringUTFChars(env, jstr, NULL); //因为还需要赋值,在C中我们转换为utf8的类型。
 if (szTemp == NULL) {
  return; 
 }

 printf("JNI cwj print=%s", szTemp); //先打印Java层传进来的值

 (*env)->ReleaseStringUTFChars(env, jstr, szTemp); //szTemp打印完不用了要及时释放掉
 
 jstr = (*env)->NewStringUTF(env, "android123"); //返新的字段值,供Java层打印
 if (jstr == NULL) {
  return;  
 }
 (*env)->SetObjectField(env, obj, fid, jstr); //设置新的属性值。
}

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

class AndroidJniDemo3 {
 private static int sAge;
 private native void readwriteField();
 public static void main(String args[]) {
  AndroidJniDemo3 ajd3 = new AndroidJniDemo3();
  AndroidJniDemo3.sAge = 23;
  ajd3.readwriteField(); //执行jni层
  System.out.println("Java cwj print="+sAge); //java层打印新的值,应该为120
 }
 static {
  System.loadLibrary("AndroidJniDemo3");
 }
}

JNIEXPORT void JNICALL
Java_AndroidJniDemo3_readwriteField(JNIEnv *env, jobject obj)
{
 jfieldID fid;
 jint nTemp;

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

 fid = (*env)->GetStaticFieldID(env, clazz, "sAge", "I"); //因为是整形,这里签名符号为I,注意使用的函数中包含Static代表是一个静态的属性
 if (fid == NULL) {
  return; 
 }

 nTemp = (*env)->GetStaticIntField(env, clazz, fid);
 printf("JNI cwj print=%d", nTemp); //这里应该显示23
 (*env)->SetStaticIntField(env, clazz, fid, 120); //设置新的值为120,注意包含了Static,java层中定义的sAge是静态的。
}

JNI/NDK开发指南(八)——调用构造方法和父类实例方法

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中调...
  • xyang81
  • xyang81
  • 2015年03月01日 21:18
  • 6074

Android NDK开发(四)——Java传递数据到C

前面几篇文章介绍了Android NDK开发的简单概念、常见错误及处理和从第一个Hello World开始实际做一个简单的JNI开发示例,相信看完之后,大家对NDK开发有了一个概念上的认识了,那么接下...
  • lee_tianya
  • lee_tianya
  • 2015年01月04日 10:02
  • 3320

Android jni/ndk编程一:jni初级认识与实战体验

Android平台很多地方都可以看到jni的身影,比如之前接触到一个投屏的项目,主要的代码是c/c++写的,然后通过Jni供java层调用;另外,就拿Android系统中的Service来说,很多的S...
  • u011913612
  • u011913612
  • 2016年09月19日 18:53
  • 1863

Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段

转自:http://blog.csdn.net/geolo/article/details/6168313 转自:http://www.android123.com.cn/android...
  • Skypine_Lee
  • Skypine_Lee
  • 2012年03月02日 09:28
  • 290

Android 在安装完成界面,点击打开应用程序。在应用程序点击home键,再从桌面打开程序导致产生多个实例或者说程序被重复打开。(为了把问题写清楚,标题一定要长长长........)

本博纯属个人开发记录, 转载请注明出处:        问题标题都已经写明了,就是在普通的安装apk完成之后,会遇到的一种情况。基本上在程序的AndroidManifest.xml里...
  • etong_123
  • etong_123
  • 2014年04月04日 23:09
  • 3762

Android NDK(JNI)学习总结一:Java代码中申明native函数-Java调用C函数,并在C函数中访问java类和方法、属性

本文不涉及android-ndk开发环境搭。步骤一:新建一个APP,名称为HelloJNI,然后定义一个类(将会在native代码中调用和访问该类):/* * mynative.cpp * * ...
  • daizhongyin
  • daizhongyin
  • 2015年07月14日 17:31
  • 1241

JNI编程基础(二)——Android Studio NDK开发

由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍。随着Android Studio 2.2的推出,Android Studio的ND...
  • asiaLIYAZHOU
  • asiaLIYAZHOU
  • 2017年04月23日 12:53
  • 551

为什么微软WP7推出那么慢?或者说为什么Android推出那么快!

为什么微软WP7推出那么慢? 可能原因 1. 软件企业文化反应就是慢! 微软是最成功的操作系统厂商,非常稳健,一定要很稳定了才推出,所以很慢! Google是互联网企业,不以beta为耻,...
  • cjq1234
  • cjq1234
  • 2012年03月23日 00:35
  • 1475

Android常用的四种布局(或者说是五种)

Android常用的四种布局(或者说是五种) 一、FrameLayout(帧布局): 显示特点:所有的子控件默认显示在FrameLayout的左上角,会重叠在一起显示。 常用...
  • LTFV5
  • LTFV5
  • 2016年12月06日 09:18
  • 187

Android:自定义Dialog上面的黑框或者说是Title怎么去掉

因为我也算是初学吧,遇到很多问题也会懵。总是百度来百度去的,但是这次确实是没找到,虽然是个比较低级的问题,相信找不到的应该不止我一个。所以也算是为了提醒自己,也算是帮助别人。所以就给大家记录了下来。 ...
  • u012833380
  • u012833380
  • 2015年11月17日 12:04
  • 4572
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
举报原因:
原因补充:

(最多只允许输入30个字)