Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
来源:互联网 发布:黑魂3帧数优化补丁3dm 编辑:程序博客网 时间:2024/05/16 06:26
转自:http://blog.csdn.net/geolo/article/details/6168313
转自: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是静态的。
}
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码
- Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
- Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
- Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- android ndk开发之二 认识jni
- Android-NDK开发之基础--Android NDK开发技巧二
- Android-NDK开发之基础--Android NDK开发技巧二
- Android NDK开发之Jni的数据类型
- Android之JNI NDK开发的常见问题
- android NDK开发之NDK与JNI
- 如何通过HTML标记或JS代码实现跳转返回页面顶部
- 15---接口与类集综合应用
- 理解 Java 时间, 日期
- IOS下app的发布流程
- 16---java反射机制00(Class类的理解)
- Android-NDK开发之基础--Android JNI实例代码(二)-- 获取/设置类的域或者说属性字段
- 这些小问题你会回答吗?
- 大小端问题
- 16---java反射机制01(认识Class)
- 16---java反射机制02(使用Class)
- Android-NDK开发之基础--Android JNI实例代码(三)-- 在JNI中构造和实例化Java类
- 在DataGrid中处理Column值的显示以及排序
- 16---java反射机制03(取得类结构)
- Android-NDK开发之基础--Android JNI实例代码(四)-- JNI中的异常处理实例代码